如何从presentView控制器返回到RootViewController?

我正在开发一个iPhone照片库应用程序,并在我的应用程序,我创build了一个文件夹到画廊,该图库文件夹显示到我的应用程序,而使用单击图像时,它导航到下一个视图控制器,他可以看到一个全尺寸的图像和我在那里设置垃圾button,这样用户可以删除那些照片,我的垃圾桶代码是:

@IBAction func btnTrash(sender: AnyObject) { let alert = UIAlertController(title: "Delete Image", message: "Are You Sure To delete this Image?", preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "Yes", style: .Default, handler: {(alertAction)in //Delete Photo PHPhotoLibrary.sharedPhotoLibrary().performChanges({ let request = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection) request.removeAssets([self.photosAsset[self.index]]) }, completionHandler: {(success, error )in NSLog("\nDeleted Image -> %@", (success ? "Success" : "Error")) alert.dismissViewControllerAnimated(true, completion: nil) self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil) if(self.photosAsset.count == 0){ // No photos Left self.imgView.image = nil println("No Image Left") // Pop to root view controller self.navigationController?.popToRootViewControllerAnimated(true) } if(self.index >= self.photosAsset.count){ self.index = self.photosAsset.count - 1 } self.displayPhoto() }) })) alert.addAction(UIAlertAction(title: "Cancle", style: .Cancel, handler: {(alertAction)in //Do not delete Photo self.dismissViewControllerAnimated(true, completion: nil) })) self.presentViewController(alert, animated: true, completion: nil) } 

我已经设置,如果没有图像剩余使用将导航到RootViewController与这行代码:

  self.navigationController?.popToRootViewControllerAnimated(true) 

但是,这是行不通的,当最后一个图像被删除,我有一个窗口:

在这里输入图像说明

和我的控制台显示:

 2014-11-05 16:45:11.502 Photos Gallary App[3046:115145] Adding Image to Library -> Success 2014-11-05 16:45:15.285 Photos Gallary App[3046:115146] Deleted Image -> Success No Image Left 2014-11-05 16:45:15.287 Photos Gallary App[3046:115146] *** Terminating app due to uncaught exception 'NSRangeException', reason: '0x7f95fb5ef980: index (18446744073709551615) beyond bounds (0)' *** First throw call stack: ( 0 CoreFoundation 0x0000000100e4f3f5 __exceptionPreprocess + 165 1 libobjc.A.dylib 0x000000010297dbb7 objc_exception_throw + 45 2 CoreFoundation 0x0000000100e4f32d +[NSException raise:format:] + 205 3 Photos 0x0000000100c5dd27 -[PHBatchFetchingArray objectAtIndex:] + 105 4 Photos 0x0000000100c63b92 -[PHFetchResult objectAtIndexedSubscript:] + 57 5 Photos Gallary App 0x0000000100b4d8d6 _TFC18Photos_Gallary_App9ViewPhoto12displayPhotofS0_FT_T_ + 694 6 Photos Gallary App 0x0000000100b50d93 _TFFFC18Photos_Gallary_App9ViewPhoto8btnTrashFS0_FPSs9AnyObject_T_U_FGSQCSo13UIAlertAction_T_U0_FTSbGSQCSo7NSError__T_ + 4243 7 Photos Gallary App 0x0000000100b4a6f6 _TTRXFo_dSboGSQCSo7NSError__dT__XFo_iTSbGSQS____iT__ + 38 8 Photos Gallary App 0x0000000100b4ed91 _TPA__TTRXFo_dSboGSQCSo7NSError__dT__XFo_iTSbGSQS____iT__ + 81 9 Photos Gallary App 0x0000000100b4a728 _TTRXFo_iTSbGSQCSo7NSError___iT__XFo_dSboGSQS___dT__ + 40 10 Photos Gallary App 0x0000000100b4a788 _TTRXFo_dSboGSQCSo7NSError__dT__XFdCb_dV10ObjectiveC8ObjCBooldGSQS___dT__ + 88 11 libdispatch.dylib 0x000000010541ccc6 _dispatch_call_block_and_release + 12 12 libdispatch.dylib 0x000000010543a7f4 _dispatch_client_callout + 8 13 libdispatch.dylib 0x0000000105425193 _dispatch_root_queue_drain + 1094 14 libdispatch.dylib 0x000000010542663c _dispatch_worker_thread2 + 52 15 libsystem_pthread.dylib 0x00000001057d0ef8 _pthread_wqthread + 314 16 libsystem_pthread.dylib 0x00000001057d3fb9 start_wqthread + 13 ) libc++abi.dylib: terminating with uncaught exception of type NSException (lldb) 

有人可以告诉我发生了什么事情,有什么解决办法吗?

self.displayPhoto()在做什么? 你想在stream行后打电话吗? 这似乎很奇怪。

尝试在self.navigationController?.popToRootViewControllerAnimated(true)后面添加一个“return”来确保执行在那里停止。

我发现我的问题的解决scheme是:

  @IBAction func btnTrash(sender: AnyObject) { let alert = UIAlertController(title: "Delete Image", message: "Are You Sure To delete this Image?", preferredStyle: .Alert) alert.addAction(UIAlertAction(title: "Yes", style: .Default, handler: {(alertAction)in //Delete Photo PHPhotoLibrary.sharedPhotoLibrary().performChanges({ let request = PHAssetCollectionChangeRequest(forAssetCollection: self.assetCollection) request.removeAssets([self.photosAsset[self.index]]) }, completionHandler: {(success, error )in NSLog("\nDeleted Image -> %@", (success ? "Success" : "Error")) alert.dismissViewControllerAnimated(true, completion: nil) // here is the code for go back to root view controller if(success){ // Move to the main thread to execute dispatch_async(dispatch_get_main_queue(), { self.photosAsset = PHAsset.fetchAssetsInAssetCollection(self.assetCollection, options: nil) if(self.photosAsset.count == 0){ println("No Images Left!!") self.navigationController?.popToRootViewControllerAnimated(true) }else{ if(self.index >= self.photosAsset.count){ self.index = self.photosAsset.count - 1 } self.displayPhoto() } }) }else{ println("Error: \(error)") } }) })) alert.addAction(UIAlertAction(title: "Cancle", style: .Cancel, handler: {(alertAction)in //Do not delete Photo self.dismissViewControllerAnimated(true, completion: nil) })) self.presentViewController(alert, animated: true, completion: nil) } 

你有没有尝试过这一行代码:

 self.presentingViewController!.dismissViewControllerAnimated(true, completion: nil) 

当你没有留下任何照片,并执行popToRoot时,它会继续执行下面这几行:

 alert.addAction(UIAlertAction(title: "Cancle", style: .Cancel, handler: {(alertAction)in //Do not delete Photo self.dismissViewControllerAnimated(true, completion: nil) })) self.presentViewController(alert, animated: true, completion: nil) 

尝试对它们进行评论,看看问题是否存在,如果存在,则取消注释。