【问题标题】:iOS 8 - performSegueWithIdentifier loads view but doesn't show until I tap the screeniOS 8 - performSegueWithIdentifier 加载视图但直到我点击屏幕才显示
【发布时间】:2014-12-31 21:36:14
【问题描述】:

我有一个选项卡栏应用程序,其中一个包含表格视图的选项卡在按下表格单元格时进入第三个视图。视图控制器充当 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

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

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

【问题讨论】:

  • 在下一个视图控制器中看起来并不多……它是什么?只是在 prepareForSegue 中设置的标签之类的?如果是这样的话,你能发布代码吗?
  • @LyndseyScott 你的意思是 DetailsViewController?这就是我现在拥有的所有代码。我实际上还没有传递任何数据,只是想先让它动画化。视图本身只是一个菜单栏和我从情节提要编辑器添加的标签。
  • 哦,好的。我以为你可能在后台执行某种动作,但我想情况并非如此......我会考虑一下......
  • 这是 100% 的代码,对吧?就像您不想在 viewDidLoad 中执行任何长时间的任务一样?
  • 所以我通过允许在点击时突出显示单元格来消除问题的症状(在我设置cell.selectionStyle = UITableViewCellSelectionStyle.None之前)。我仍然困扰着这个问题可能仍然存在,但至少现在可以了。

标签: ios iphone xcode swift


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    在我的 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 */);
    
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 1970-01-01
      • 1970-01-01
      • 2015-02-20
      • 1970-01-01
      • 2020-06-13
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      相关资源
      最近更新 更多