【问题标题】:Having more than one storyboard in Xcode在 Xcode 中拥有多个故事板
【发布时间】:2017-08-25 01:10:05
【问题描述】:

问题:在带有表格视图的 xib 中创建了一个视图控制器。但是,表格视图的行为非常奇怪,看起来不像我们在故事板中使用的表格视图。

我的计划是用我在另一个 xib 文件中创建的自定义表格视图单元格填充此表格视图。但是,遗憾的是,它并没有像我预期的那样工作,因为一切都关闭了,并且这些单元格被实例化了,我知道我的自定义单元格可以工作,因为它已经在我在情节提要中创建的其他视图控制器中工作:

我想要一种方法来设计我的视图控制器,这样我就可以在需要时实例化它们,我的理由是我不希望有一个非常丰富的故事板。现在我知道我不能在 xib 文件中使用表格视图,就像我们在情节提要中使用它一样。有解决办法吗?我需要另一个故事板来实现这一点吗?

【问题讨论】:

  • 您创建的内容看起来像一个表格视图,而不是一个表格视图控制器。这就是为什么它们是不同的。此外,没有什么可以阻止您创建另一个故事板。随着项目的发展,这也很常见。
  • 嗨 Yuchen,它是一个表格视图,而不是一个表格视图控制器。为什么人们在他们的项目中不止有故事板,为什么它有用且普遍?
  • Storyboard 是基于 xml 的,当多人同时工作时很容易产生冲突。而且这些冲突很难解决。此外,随着故事板变得越来越复杂,它的渲染速度可能会非常缓慢且难以使用。所以,是的,让它们更小更容易。
  • 查看故事板参考。例如参见:useyourloaf.com/blog/refactoring-with-storyboard-references

标签: ios swift xcode uistoryboard


【解决方案1】:

任务1.从Xib加载UIViewcontroller

我们可以加载 UIViewcontroller 表单 Xib 而不是 Storyboard。我们可以使用以下程序:

1.创建一个 UIViewcontroller。

 XCode File -> New -> File -> Cocoa Touch Class -> Fill Class with your class name , subclass of with UIViewController , check Also create Xib file, language Swift -> Next - Create.

 Example: ViewControllerFromXib

2。覆盖 init()。

override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: Bundle?) 
{
   super.init(nibName: "ViewControllerFromXib", bundle: Bundle.main)
}

required init?(coder aDecoder: NSCoder) 
{
   super.init(coder:aDecoder)
}

3.打开新创建的Controller

let controller = ViewControllerFromXib.init()
self.present(controller, animated: true, completion: nil)

通过上述方式,我们可以从XIB加载一个UIViewcontroller。

任务 2. 创建一个表格视图并使用自定义 xib 填充它的单元格

1.创建自定义 UItableViewCell

XCode File -> New -> File -> Cocoa Touch Class -> Fill Class with your cell name , subclass of with TableViewCell ,检查 Also create Xib file, language Swift -> Next - Create.

示例:CustomTableViewCell

1.为您的 TableView 注册 UItableViewCell。

override func viewDidLoad() {
    super.viewDidLoad()
    self.title = "Item"
    self.tableView.register(UINib(nibName: "CustomTableViewCell", bundle:Bundle.main), forCellReuseIdentifier: "CustomTableViewCell");
}

2。将 UITableViewDataSource 实现到您的视图控制器中

extension ViewControllerFromXib:UITableViewDataSource {

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 3;
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "CustomTableViewCell", for: indexPath) as! CustomTableViewCell
        return cell

    }

}

2。将 UITableViewDelegate 实现到您的 Viewcontroller 中。

extension ViewControllerFromXib:UITableViewDelegate {

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat{

        return UITableViewAutomaticDimension;

    }

}

【讨论】:

    【解决方案2】:

    是的,您可以在应用程序中使用任意数量的故事板。

    我尝试为每个工作流程设置 1 个故事板。然而,一些不太热衷于故事板的开发人员为每个视图控制器使用 1 个故事板。

    从名为“MyStoryboard”的故事板中获取初始视图控制器:

    let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
    let viewController = storyboard.instantiateInitialViewController()!
    

    或者获取一个标识符为“MyViewController”的视图控制器。

    let storyboard = UIStoryboard(name: "MyStoryboard", bundle: nil)
    let viewController = storyboard.instantiateViewController(withIdentifier: "MyViewController")!
    

    视图控制器有两种基本方法可以访问另一个故事板中的第二个视图控制器。

    1. 在情节提要中,使用 Storyboard Reference 到第二个视图控制器,然后使用 show segue 推送第二个视图控制器。

    2. 在视图控制器的源代码中,使用instantiateInitialViewController()instantiateViewController(withIdentifier:) 创建第二个视图控制器并将其推送到导航控制器上。

    【讨论】:

    • 感谢您的回复,如果我的第一个故事板包含导航视图控制器,我的第二个故事板如何知道嵌入在第一个故事板中的导航控制器?换句话说,我如何继续“导航”?
    【解决方案3】:

    您可以在同一个项目中拥有多个故事板。

    我通常喜欢每个“主”屏幕有 1 个故事板,这很容易以编程方式实例化,也可以在 IB 中链接。

    至于您的问题,我建议您在 .xib 文件中创建自定义的 uitableviewcell。作为一个独立的观点。这样,在您的代码上,您可以将其注册为您想要的任何视图控制器的“可重用单元”,而不管包含它的情节提要如何。

    【讨论】:

    • 我确实创建了一个自定义表格视图单元格。为什么拥有许多故事板有助于您的工作流程?谢谢
    • 因为在处理大型项目时,许多人可以专注于应用程序的各个部分。另外,现在拆分它们确实没有缺点,因为故事板可以使用故事板引用相互链接,或者只是有一个以编程方式呈现所需故事板的管理类。这对于 MVVM 模式特别有用,因为视图及其控制器中几乎没有业务逻辑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多