我有一个带有帖子列表的UITableViewController。当我按一个单元格时,我将在发布图片和评论下载期间显示一个alertController。然后解雇alertController并推送帖子的UIViewController(PostViewcontroller)。 PostViewcontroller有一个用于这些注释的UITableView。

目前,我的行为是:


按下我的UITableViewController的单元格
显示alertController
下载图片和评论
退出alertController
PostViewcontroller调用cellForRowAtIndexPath为
帖子的每个评论。有很多评论,因此需要一个
很多时间
最后,UITableViewController推送PostViewcontroller


我想在所有cellForRowAtIndexPath调用之后,在推送PostViewcontroller之前关闭alertController。

例外行为:


按下我的UITableViewController的单元格
显示alertController
下载图片和评论
PostViewcontroller调用cellForRowAtIndexPath为
帖子的每个评论。有很多评论,因此需要一个
很多时间
退出alertController
最后,UITableViewController推送了PostViewcontroller


在我的UITableViewController中:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    var post : Post = posts[indexPath.row] as Post

    //Display the alert controller during the image downloading
    var alert = UIAlertController(title: "Alert", message: text, preferredStyle: UIAlertControllerStyle.Alert)
    self.presentViewController(alert, animated: true, completion: nil)

     // If the image does not exist, we need to download it
     var imageUrl: NSURL! = NSURL(string: post.attachment!.imageUrl)

     // Download an NSData representation of the image at the URL
     let request:NSURLRequest=NSURLRequest(URL:imageUrl)
     NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!,data: NSData!,error: NSError!) -> Void in

         if error == nil {

            var image = UIImage(data: data)
            CoreDataManager.sharedManager.addImageToCoreData(post, image:image!, type:"full")

            //download the comments
            self.comments=self.api.getCommentsData(post)

            dispatch_async(dispatch_get_main_queue(), {
                 if let cellToUpdate = tableView.cellForRowAtIndexPath(indexPath) {

                    //Image and comments downloaded, dismiss the alertcontroller
                    self.dismissViewControllerAnimated(true, completion: {

                        self.performSegueWithIdentifier("postview", sender: self)

                    })

                    }
                })
            }
        })
    }


我使用prepareForSegue:

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "postview" {

        if let indexPath = self.tableView.indexPathForSelectedRow() {

            let destination = (segue.destinationViewController as! UINavigationController).topViewController as! PostViewController

            destination.post=selectedPost!
            destination.comments=comments!
            destination.delegate=self

            self.splitViewController?.toggleMasterView()
        }
    }
}


我试图在prepareForSegue中关闭alertController,但是出现此错误:

pushViewController:animated: called on <UINavigationController 0x78e43070> while an existing transition or presentation is occurring; the navigation stack will not be updated.


我不知道该怎么办,如果可能的话。我错过了什么,但是呢?

最佳答案

在加载视图控制器本身之前,不能强制视图控制器的表视图加载其单元格。

您可以将行为更改为以下内容:


按下我的UITableViewController的单元格
推动PostViewcontroller
显示alertController(从PostViewController内部)
下载图片和评论
告诉PostViewController的tableView到reloadData(它只会
加载填充显示所需的单元格,这样就不会
需要很多时间。)
退出alertController


另一个选择是让每个tableViewCell下载自己的图像和注释。当下载正在进行时,它可以显示活动指示器,然后在下载完成后显示数据。

苹果公司有示例代码演示了这一点:https://developer.apple.com/library/ios/samplecode/LazyTableImages/Introduction/Intro.html

10-08 12:58