How to get back to RootViewController from PresentView controller?
I am developing an iPhone Photos Gallery app and in my app I have created one folder in the gallery and this gallery folder is displayed in my app and when using click "Image" go to the next view controller where it can see the full one and I set the junk there a button so the user can delete those photos and my trashButton code is:
@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)
}
I have set if the image is left unused will navigate to RootViewController
with this line of code:
self.navigationController?.popToRootViewControllerAnimated(true)
But that doesn't work and when the last image is removed I got the window:
and my console appears:
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)
Can anyone tell me what is going on and what is the solution for this?
source to share
I found a solution for my question:
@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)
}
source to share
When you have no photos and do popToRoot, it keeps on executing the following lines:
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)
Try commenting them out to see if the problem exists, and if so, uncomment the solution.
source to share