在没有故事板的情况下创建和执行segue

时间:2016-03-25 08:33:26

标签: ios iphone xcode swift

我有一个没有故事板的应用程序,所有UI创建都是在代码中创建的,我得到了一个splitView我可以在iPhone上使用它,因为该应用程序最初是专为iPad设计的,所以当你在主视图的列表中选择一行,它在iPhone上什么都不做,但在iPad上工作正常。

所以我的问题是我可以创建并执行允许在didSelectRowAtIndexPath方法上显示详细信息视图的segue吗?

这是我到目前为止所做的事情:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let segue = UIStoryboardSegue(identifier: "test", source: self, destination: detailViewController!)
        performSegueWithIdentifier("test", sender: self)
    }

但是当运行并选择一行时,应用程序崩溃,告诉它需要一个执行处理程序,所以我添加了这个:

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let segue = UIStoryboardSegue(identifier: "test", source: self, destination: detailViewController!, performHandler: { () -> Void in
                let object = self.fetchedResultsController.objectAtIndexPath(indexPath)
                let controller = self.detailViewController!
                controller.detailItem = object
                controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
                controller.navigationItem.leftItemsSupplementBackButton = true


        })
        performSegueWithIdentifier("test", sender: self)
    }

现在当选择行时,xcode表示没有带有这种标识符的segue" test"。

我还尝试通过segue.perform()调用它并将performHandler内容添加到prepareForSegueMethod中:

 if segue.identifier == "test" {
            if let indexPath = self.tableView.indexPathForSelectedRow {
                let object = self.fetchedResultsController.objectAtIndexPath(indexPath)
                let controller = (segue.destinationViewController as! UINavigationController).topViewController as! DetailViewController
                controller.detailItem = object
                controller.navigationItem.leftBarButtonItem = self.splitViewController?.displayModeButtonItem()
                controller.navigationItem.leftItemsSupplementBackButton = true
            }
        }

并且它什么也没做,没有崩溃,只是突出显示我选择的行以及所有

你能帮助我吗?

编辑:正如Oleg Gordiichuk所说,没有故事板,我不可能做我想做的事情,所以感谢他的帮助:)

2 个答案:

答案 0 :(得分:8)

认为它是故事板交互的组成部分,可以从类UIStoryboardSegue的名称中理解。以编程方式创建segues是个坏主意。如果我没有犯错误,故事板会为你创建它们。

为了解决您的问题,请尝试使用一些常见的方法,例如只显示ViewController

let vc = self.storyboard?.instantiateViewControllerWithIdentifier("id") as! MyController
self.presentViewController(vc, animated: true, completion: nil)

正如我在评论中的对话中所理解的那样。您想使用没有故事板的segue为tableview创建导航到详细信息视图。现在没有故事板就不可能做到这一点。

为了将来的学习,请尝试调查此information

答案 1 :(得分:0)

一种方法是使用didSelectRow

tableView方法

Swift 3.x

// MARK: - Navigation & Pass Data
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    print("Selected Row \(indexPath.row)")
    let nextVC = YourNextViewController()
    nextVC.YourLabel.text = "Passed Text"
    nextVC.YourLabel.text = YourArray[indexPath.row]

    // Push to next view
    navigationController?.pushViewController(nextVC, animated: true)
}