iOS 8 - performSegueWithIdentifier加载视图但在我点击屏幕之前不显示

时间:2014-12-31 21:36:14

标签: ios iphone xcode swift

我有一个Tab Bar应用程序,其中一个包含Table View的选项卡在按下表格单元格时会进入第三个视图。视图控制器充当UITableView的委托,我以编程方式触发segue,如下所示:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    println("cell tapped, starting segue")
    performSegueWithIdentifier("showDetails", sender: self)
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    println("prep for segue")
    // TODO - more code here
}

最后,我设置了以下代码来调试第三个视图的问题:

class DetailsViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        println("did load")
    }
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        println("will appear")
    }
}

问题当我第一次按下表格单元格时,viewWillAppear函数永远不会被调用,直到我以某种方式与UI交互(例如,只需点按一下屏幕上)。我想要进入的视图没有显示,就好像屏幕没有刷新一样。然而,当我点击屏幕时,整个动画运行,我可以按预期进行调整。当我点击一个单元格时,这是我的输出:

cell tapped, starting segue
prep for segue
did load

我试图在网上找到解决方案,但我发现的所有问题似乎都根本不起作用。就我而言,它是有效的,但不是立即的。

如果它有帮助,这是我的故事板的截图:

Screenshot of my Storyboard

2 个答案:

答案 0 :(得分:0)

Sefu找到答案并将其发布在评论中,我遇到了同样的问题,他的解决方案对我有用。诀窍是使选择触发segue的单元格需要设置选择样式(而不是None),并且我还发现取消选择tableView中的单元格:didSelectRowAtIndexPath:也需要发生。

答案 1 :(得分:0)

在我的selectionStyle = .None时遇到类似的问题。 您可以使用的选项,如果您像我一样并且不希望应用selectionStyle,则在准备segue时将单元格项目设置为未选中。 这似乎阻止了'问题'我看到segue一次完美地工作,但所有后续调用都需要选择两次单元格。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    //sending the index path up as the sender so the prep for segue can access the cell
    self.performSegueWithIdentifier("segueID", sender: indexPath);
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "segueID"){
        if let indexPath : NSIndexPath = sender as? NSIndexPath{
            tableViewReference.cellForRowAtIndexPath(indexPath)?.selected = false;

            let destinationVC : UIViewControllerClass = segue.destinationViewController as! UIViewControllerClass;
            destinationVC.customMethod(/* some value */);

        }
    }
}