我的segue正在加载我的UIViewController,在最后一行添加数据之前

时间:2016-05-10 17:15:44

标签: ios swift uitableview segue

在我向UITableView添加了额外的segue之后发生了这个错误。因此,不是将segue从tableViewCell传递到我的UIViewController,它现在来自UITableViewController到2个不同的UIViewControllers。

我为segu showVerseshowAbout设置了唯一标识符。

我的UITableView中的代码如下所示:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if ( indexPath.section == 4 ) {
        performSegueWithIdentifier("showAbout", sender: self)
    } else {
        performSegueWithIdentifier("showVerse", sender: self)
    }   
}

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {   
    if segue.identifier == "showVerse" {
        let pageDetailViewController = segue.destinationViewController as! PageViewController

        // Get the cell that generated this segue.
        if let selectedCell = sender as? PageTableViewCell { 
          //  ^~~~~~ This line loads my PageViewController for some reason 
          // Then my PageViewController fails because it doesn't have a `.page`

            let indexPath = tableView.indexPathForCell(selectedCell)!
            let verse     = self.items[indexPath.section][indexPath.row].verse

            for page in pages {
                if page.valueForKey("chapter") as! Int == indexPath.section + 1 && page.valueForKey("verse") as! Int == verse {


                    pageDetailViewController.page = page
                  //    ^~~~~ If it could get to this line, then it would have loaded correctly.


                }
            }

        }
    } else {
        segue.destinationViewController as! AboutController
    }

}

当我的indexPath.section为0 - 3时,它会在分配.page之前加载我的PageViewController。

当我的segue从UITableViewCell到UIViewController时,我没有遇到这个问题。它似乎等待我的所有代码行运行。然后它会知道我的.page何时被设置。

2 个答案:

答案 0 :(得分:1)

您的didSelectRowAtIndexPath:方法正在将self sender参数发送给performSegueWithIdentifier:,但您尝试将sender投射为PageTableViewCellprepareForSegue:中将失败,因为sender是一个视图控制器。

执行segue时,您应该将单元格作为sender发送。

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    if ( indexPath.section == 4 ) {
        performSegueWithIdentifier("showAbout", sender: tableView.cellForRowAtIndexPath(indexPath))
    } else {
        performSegueWithIdentifier("showVerse", sender: tableView.cellForRowAtIndexPath(indexPath))
    }   
}

答案 1 :(得分:1)

我不认为发送者应该在你的performSegueWithIdentifier方法中自我。

我会沿着这些方向做点什么:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let cell = tableView.cellForRowAtIndexPath(indexPath)
    if ( indexPath.section == 4 ) {
        performSegueWithIdentifier("showAbout", sender: cell)
    } else {
        performSegueWithIdentifier("showVerse", sender: cell)
    }   
}