prepareForSegue()不工作(swift)

时间:2015-03-22 23:52:12

标签: ios iphone swift

希望得到一些帮助来确定我的prepareForSegue()无效的原因。

这是我的Main.storyboard和segue的标识符。 http://i.stack.imgur.com/GFsqF.png

我将Prototype单元作为选择segue(show)链接到UITabBarController,它将有几个UIViewController连接到它。我在prepareForSegue中放置了断点并且看到它永远不会进入函数,我怀疑我可能错误地设置了segue但是我在iOS开发方面缺乏经验使我忽略了问题所在。

这是我在我的MainViewController上的prepareForSegue()的prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showLesson" {
        var tabBarVC: UITabBarController = segue.destinationViewController as UITabBarController
        var descVC: LessonsDetailsViewController = tabBarVC.viewControllers?.first as LessonsDetailsViewController
        var row = tableView!.indexPathForSelectedRow()!.row
        var dataObj = lessonsNSMObj[row]
        descVC.managedObject = dataObj
    }
}

我确实找到了一个解决方法,但我不确定这是否是这样做的合适方式,或者是否有这样做的垮台。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "showLesson" {
        var tabBarVC: UITabBarController = segue.destinationViewController as UITabBarController
        var descVC: LessonsDetailsViewController = tabBarVC.viewControllers?.first as LessonsDetailsViewController
        var row = sender as Int
        var dataObj = lessonsNSMObj[row]
        descVC.managedObject = dataObj
    }
}

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    tableView.deselectRowAtIndexPath(indexPath, animated: true)
    let row = indexPath.row
    performSegueWithIdentifier("showLesson", sender: row)
}

任何帮助都会非常感激!我还在github上提供了整个项目:https://github.com/schuob/

2 个答案:

答案 0 :(得分:1)

好的,看了你的代码后,我发现了问题。您正在viewDidLoad中注册该类,当您在故事板中有一个连接到segue的单元格时,您不应该这样做。注册类,告诉表视图从类的代码而不是IB中获取其单元格,因此IB中发出segue的单元格不是您要出列的单元格。要解决此问题,只需删除注册该类的行。您还应该删除didSelectRowAtIndexPath中的performSegue行,否则您将尝试两次。

您需要更改prepareForSegue以从单元格中获取indexPath。该单元格将是发件人,因此您可以这样做,

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

        let cell = sender as UITableViewCell
        if segue.identifier == "showLesson" {
            var tabBarVC: UITabBarController = segue.destinationViewController as UITabBarController
            var descVC: LessonsDetailsViewController = tabBarVC.viewControllers?.first as LessonsDetailsViewController
            var row = self.tableView.indexPathForCell(cell)?.row
            var dataObj = lessonsNSMObj[row!]
            descVC.managedObject = dataObj
        }
    }

您还需要将cellForRowAtIndexPath中的标识符更改为“LessonCell”(大写字母为“L”),因为这是您在故事板中调用的内容。

答案 1 :(得分:0)

使用 prepareForSegue performSegueWithIdentifier 并没有错。但是,您的ManagedObject代码中似乎有一个错误。我拿了你的代码然后运行它,并在托管对象访问中遇到错误(数组索引超出范围)。我评论了错误的语句并执行了代码。 prepareForSegue 以及 performSegueWithIdentifier 都按预期执行。

我不同意见rdelmar和' 1s和0s'关于从行中划分。它通常在我见过的几个Apple程序中完成。我没有看到任何错误。