繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM