[英]How to go back to RootViewController from presentView controller?
我正在开发一个iPhone照片库应用程序,在我的应用程序中,我创建了一个文件夹到库中,该库文件夹显示在我的应用程序中,同时使用点击图像,它导航到下一个视图控制器,在那里他可以看到一个完整的图像和我在那里设置了垃圾按钮,以便用户可以删除那些照片,我的trashButton代码是:
@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()
做法是什么? 你想在流行后打电话吗? 这看起来很奇怪。
尝试在self.navigationController?.popToRootViewControllerAnimated(true)
之后的行添加“return”以确保执行在那里停止。
我发现我的问题的解决方案是:
@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)
尝试对它们进行评论以查看问题是否存在,如果存在,则取消解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.