【发布时间】:2014-11-15 13:26:27
【问题描述】:
我翻译了一个项目的代码,该项目的代码可以从 obj-c 在 swift 中完美运行。它从用户直接从cameraRoll 导入应用程序的图像数组创建电影。如果我在用 obj-c 编写的项目中运行代码可以正常工作,但是如果我遇到 swift 会给我以下错误:
2014-11-15 13:07:38.535 CEMovieMaker[1278:406246] -[PHFetchResult CGImage]:无法识别的选择器发送到实例 0x7f88f1fa20a0
2014-11-15 13:07:38.536 CEMovieMaker[1278:406246] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[PHFetchResult CGImage]:无法识别的选择器发送到实例 0x7f88f1fa20a0”
*** 首先抛出调用栈:
(
0 CoreFoundation 0x0000000103891f35 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000102df5bb7 objc_exception_throw + 45
2 CoreFoundation 0x000000010389904d -[NSObject(NSObject) doesNotRecognizeSelector:] + 205
3 CoreFoundation 0x00000001037f127c ___forwarding___ + 988
4 CoreFoundation 0x00000001037f0e18 _CF_forwarding_prep_0 + 120
5 CEMovieMaker 0x000000010278e655 __53-[CEMovieMaker createMovieFromImages:withCompletion:]_block_invoke + 277
6 AVFoundation 0x000000010346db8e -[AVAssetWriterInputMediaDataRequester requestMediaDataIfNecessary] + 88
7 libdispatch.dylib 0x00000001074c3ba6 _dispatch_call_block_and_release + 12
8 libdispatch.dylib 0x00000001074e17f4 _dispatch_client_callout + 8
9 libdispatch.dylib 0x00000001074c9b22 _dispatch_queue_drain + 1417
10 libdispatch.dylib 0x00000001074c9432 _dispatch_queue_invoke + 235
11 libdispatch.dylib 0x00000001074cbfc1 _dispatch_root_queue_drain + 685
12 libdispatch.dylib 0x00000001074cd5d9 _dispatch_worker_thread3 + 111
13 libsystem_pthread.dylib 0x00000001078656cb _pthread_wqthread + 729
14 libsystem_pthread.dylib 0x00000001078634a1 start_wqthread + 13
)
libc++abi.dylib:以 NSException 类型的未捕获异常终止
(lldb)
代码如下:
var photoAsset:PHFetchResult!
@IBAction func creaFilmato(sender: AnyObject) {
println("Crea il tuo filmato")
let img1:UIImage = UIImage(named: "image1.jpg")!
let settings:NSDictionary = CEMovieMaker.videoSettingsWithCodec(AVVideoCodecH264, withWidth: img1.size.width, andHeight: img1.size.height)
let prova = CEMovieMaker(settings: settings)
prova.createMovieFromImages([self.photoAsset.copy()], withCompletion: {(success:Bool, fileURL:NSURL!) in
if(success){
self.viewMovieAtURL(fileURL)
// Save movie in cameraRoll
let library:ALAssetsLibrary = ALAssetsLibrary()
library.writeVideoAtPathToSavedPhotosAlbum(fileURL, completionBlock: {(assetURL:NSURL!, error) in
if((error) != nil) {
println("Errore nel salvataggio del filmato %@",error)
}
})
}
})
println("Esportato!")
}
func viewMovieAtURL(fileURL:NSURL!)->Void {
let playerController:MPMoviePlayerViewController = MPMoviePlayerViewController(contentURL: fileURL!)
playerController.view.frame = self.view.bounds
self.presentMoviePlayerViewControllerAnimated(playerController)
playerController.moviePlayer.prepareToPlay()
playerController.moviePlayer.play()
self.view.addSubview(playerController.view)
}
有人可以帮我吗?
我尝试给出命令 self.photoAsset.copy(),但结果总是一样的。我把这段代码放在 obj -c
- (IBAction)process:(id)sender {
NSMutableArray *frames = [[NSMutableArray alloc] init];
//NSMutableArray *frames;
UIImage *img1 = [UIImage imageNamed:@"image1"];
UIImage *img2 = [UIImage imageNamed:@"image2"];
UIImage *img3 = [UIImage imageNamed:@"image3"];
UIImage *img4 = [UIImage imageNamed:@"image4"];
UIImage *img5 = [UIImage imageNamed:@"image5"];
//frames = [[NSMutableArray alloc] initWithObjects:img1, img2, img3, img4, img5, nil];
NSDictionary *settings = [CEMovieMaker videoSettingsWithCodec:AVVideoCodecH264 withWidth:img1.size.width andHeight:img1.size.height];
self.movieMaker = [[CEMovieMaker alloc] initWithSettings:settings];
for (NSInteger i = 0; i < 2; i++) {
[frames addObject:img1];
[frames addObject:img2];
[frames addObject:img3];
[frames addObject:img4];
[frames addObject:img5];
}
[self.movieMaker createMovieFromImages:[frames copy] withCompletion:^(BOOL success, NSURL *fileURL){
if (success) {
[self viewMovieAtUrl:fileURL];
//scrivere qui il codice per salvare il video in camera roll??
ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
[library writeVideoAtPathToSavedPhotosAlbum:fileURL
completionBlock:^(NSURL *assetURL, NSError *error) {
if (error)
NSLog(@"Error saving to camera roll: %@",error);
//else
// remove temporary movie file
}];
}
}];
}
- (void)viewMovieAtUrl:(NSURL *)fileURL
{
MPMoviePlayerViewController *playerController = [[MPMoviePlayerViewController alloc] initWithContentURL:fileURL];
[playerController.view setFrame:self.view.bounds];
[self presentMoviePlayerViewControllerAnimated:playerController];
[playerController.moviePlayer prepareToPlay];
[playerController.moviePlayer play];
[self.view addSubview:playerController.view];
}
这里的功能是 in swift ,因为我传递了一个图像数组。我想要的不是数组,而是由应用程序创建的文件夹中的所有图像组成
【问题讨论】:
-
您似乎显示了错误的代码。显示
createMovieFromImages:。另外,createMovieFromImages:还在 Objective-C 中吗?这可能是您问题的一部分;当你把它翻译成 Swift 并且类型变得更清晰时,事情可能会更好。在纯 Swift 中几乎不可能出现无法识别的选择器错误——这是它的优势之一。
标签: objective-c image swift ios8