【问题标题】:storyboard elements not visible in view controller after seguesegue 后,故事板元素在视图控制器中不可见
【发布时间】:2019-08-02 00:24:44
【问题描述】:

我向我的故事板添加了一个带有一些简单表单元素的视图控制器 (vc2),并从现有的 tableviewcontroller (vc1) 进行了 segue ctrl-draging,这是由尾随滑动按钮触发的

我可以在调试器中看到打印函数的输出(在下面的 vc2 代码中),但我的表单元素不可见。由于某种原因,我不得不手动设置默认为黑色的背景颜色,而不是故事板上设置的颜色。我认为这与我加载 vc2 的方式有关,但是我尝试将代码更改为正常的 performSegueWithIdentifier 导致了

'NSInvalidArgumentException',原因:'Receiver() 与 标识符

然后我删除并重新制作了segue,但没有任何效果。所以我把代码改回了这个,它可以工作,但不能渲染故事板元素。

func clickView(forRowAtIndexPath indexPath: IndexPath) {
    let myContents = UnitComponents[indexPath.row]
    print("Clicked Report \(self.ProjectID) \(self.ShipListID) \(self.UnitName) \(myContents.sku)")

    self.Sku = myContents.sku

    let vc = ComponentViewController()
    vc.Sku = myContents.sku
    navigationController?.pushViewController(vc, animated: true)        

}

这是vc2代码

import UIKit

class ComponentViewController: UIViewController {

var Sku = ""
var UnitName = ""
var ShipListID = ""
var ProjectID = ""

@IBOutlet var damageDesc: UITextView!

@IBOutlet var repairCost: UITextField!

override func viewDidLoad() {
    super.viewDidLoad()

    self.view.backgroundColor = #colorLiteral(red: 1.0, green: 1.0, blue: 1.0, alpha: 1.0)

    print("Hello World \(Sku) \(UnitName) \(ShipListID) \(ProjectID)");

    // Do any additional setup after loading the view.
}

@IBAction func saveReport(_ sender: Any) {

    print("damageDesc \(String(describing: damageDesc ?? nil))")
    print("repairCost \(String(describing: repairCost ?? nil))")


}



}

如何修复我的代码,以便加载情节提要布局等并且我可以在应用中看到表单元素?

这是转到另一个视图控制器的错误方式吗?我问是因为似乎围绕这个主题的一些 SO 问题表明它没有正确调用情节提要。我正在寻找如何执行此操作的 swift 5 示例,并且仅找到对 instantiateViewControllerWithIdentifier("ViewController") 的引用,这似乎不在 swift 5 中

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = ShippingUnitsTableViewController()
    vc.ShipListID = ShipLists[indexPath.row].ListID
    vc.ProjectID = ProjectID
    navigationController?.pushViewController(vc, animated: true)

}

【问题讨论】:

标签: swift xcode


【解决方案1】:

您需要指定视图控制器所在的情节提要,然后从该情节提要中实例化视图控制器。用下面的替换你的函数:-

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let storyboard = UIStoryboard(name: "Main", bundle: nil)    
    let vc = storyboard.instantiateViewController(withIdentifier: "ShippingUnitsTableViewController") as! ShippingUnitsTableViewController
    vc.ShipListID = ShipLists[indexPath.row].ListID
    vc.ProjectID = ProjectID
    navigationController?.pushViewController(vc, animated: true)
}

并确保(在 Main.storyboard 文件中)您在属性检查器中将 ViewController(需要显示)的 Storyboard ID 设置为 ShippingUnitsTableViewController(见下图):-

【讨论】:

  • 谢谢。我使用 segues 发布的答案也有效。您的解决方案是更好的方法吗?如果是这样,我会将您的答案标记为正确
  • 我只是对同一件事讲了一种不同的方法,如果你不想声明'prepare'函数,你可以使用这个方法。最后,使用最适合您的。
  • 对此进行了测试,效果很好。再次感谢您提供这种替代方法
  • @MikeVolmar 你也介意投票赞成答案
  • 我几天前投了赞成票。我也会把它标记为正确答案
【解决方案2】:

你可以试试

func clickView(forRowAtIndexPath indexPath: IndexPath)

取而代之的是 tableview 委托方法的 didSelectRow 或视图控制器的 performSegueWithIdentifier ?

【讨论】:

  • 不太确定您的建议。如果我将 navigationController?.pushViewController(vc, animated: true) 更改为 performSegue(withIdentifier: "ReportFormVC", sender: self) 我收到一个错误 - 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'Receiver () 没有带有标识符“ReportFormVC”的segue
  • 删除你的 clickView 函数,使用 tableview 的 didSelectRow 方法,或者你可以使用具有 performSegueWithIdentifier 方法的相同目的视图控制器。因为您没有为视图控制器设置任何标识符,所以将其崩溃,您应该转到故事板 ReportFormVC,然后从 xcode 的右侧面板中选择显示属性检查器,指定 segue 标识符。 developer.apple.com/documentation/uikit/uiviewcontroller/…
  • segue 已经在属性检查器中设置了正确的标识符。
【解决方案3】:

好的,这个问题的解决方案需要改变我在视图控制器之间移动的方式。下面的 didSelectRowAt indexPath 方法不使用情节提要,这会导致目标视图控制器有点像孤儿并且不知道情节提要转场。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let vc = ShippingUnitsTableViewController()
    vc.ShipListID = ShipLists[indexPath.row].ListID
    vc.ProjectID = ProjectID
    navigationController?.pushViewController(vc, animated: true)

}

我将 didSelectRowAt indexPath 更改为此,并将必要的信息位添加到 prepareSegue 方法中,如下所示。

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    self.ListID = ShipLists[indexPath.row].ListID
    performSegue(withIdentifier: "UnitsVC", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "UnitsVC"{
        let nextViewController = segue.destination as? ShippingUnitsTableViewController
        nextViewController!.ProjectID = self.ProjectID
        nextViewController!.ShipListID = self.ListID
    }
}

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-01
    • 2015-05-18
    • 2021-08-05
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多