【问题标题】:Create and perform segue without storyboards在没有故事板的情况下创建和执行 segue
【发布时间】:2016-07-13 00:16:16
【问题描述】:

我有一个没有故事板的应用程序,所有 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)
    }

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

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。

我也尝试通过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 所说,没有故事板就不可能做我想做的事,所以感谢他的帮助 :)

【问题讨论】:

    标签: ios iphone xcode swift


    【解决方案1】:

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

    为了解决您的问题,请尝试使用一些常见的方式,例如简单地呈现ViewController

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

    我从我们在 cmets 的谈话中了解到。您想使用没有情节提要的 segues 为 tableview 创建导航到详细信息视图。目前,没有故事板是不可能做到这一点的。

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

    【讨论】:

    • 感谢您的回答,我尝试使用 pushViewController,它正在替换视图,并在 iPhone 6 Plus 和 6S Plus 处于横向模式时导致问题。您的解决方案对我不起作用,因为我没有任何故事板,所以 self.storyboard 总是返回 nil,但我将 splitView 中的两个控制器的引用引用到 AppDelegate 文件中,但仍然无法工作“应用程序已尝试以模态方式呈现活动控制器”
    • 使用 navigationcontroller 在其上呈现视图控制器。
    • 试过了:let navC = UINavigationController(rootViewController: shared.mediaListController) self.presentViewController(navC, animated: true, completion: nil) 它有效,但不是我要找的 ^^ ' 我只希望详细视图显示就像在 iPhone 上的主/详细视图的 xcode 示例中一样
    • 您想从 tableview 显示详细视图?
    • 是的,因为它在 iPad 上运行良好,因为 SplitView 在 iPhone 和 iPad 之间的处理方式不同,6S Plus 和 6S Plus 例外,这给我带来了问题 ^^ 就像 xcode 示例一样,a只需单击一行,就会出现详细视图,(我目前正在使用 pushViewController 执行此操作,这似乎会阻止 iphone 6 plus 上的所有内容)
    【解决方案2】:

    一种方法是对tableView 使用didSelectRow 方法

    斯威夫特 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)
    }
    

    【讨论】:

      猜你喜欢
      • 2012-05-12
      • 2012-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-27
      • 2013-04-18
      • 2011-12-27
      • 2016-05-15
      相关资源
      最近更新 更多