繁体   English   中英

Xcode中有多个故事板

[英]Having more than one storyboard in Xcode

问题:在带有表视图的xib中创建了一个视图控制器。 但是,表格视图的行为非常奇怪,看起来与我们在情节提要中使用的表格视图不一样。

在此处输入图片说明

我的计划是使用在另一个xib文件中创建的自定义表格视图单元格填充此表格视图。 但是,可悲的是,它没有按我预期的那样工作,因为一切都已关闭并且实例化了这些单元格,我知道我的自定义单元格可以工作,因为它已在故事板中创建的另一个视图控制器中工作:

]]]]]]

我想要一种设计视图控制器的方法,这样我就可以在需要时实例化它们,其背后的原因是我不想拥有一个人口众多的情节提要。 现在,我知道我无法像在情节提要中一样使用xib文件中的表格视图。 有没有解决的办法? 我需要另一个情节提要来实现吗?

是的,您可以在应用程序中使用任意数量的情节提要。

我尝试为每个工作流程设置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. 在情节提要中 ,使用“ 情节提要”引用第二个视图控制器,然后使用show segue推送第二个视图控制器。

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

任务1.加载UIViewcontroller表单Xib

我们可以加载一个UIViewController形式厦门国际银行 ,而不是故事板 我们可以使用以下过程:

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.打开新创建的控制器

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

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

任务2.使用自定义xib创建一个tableview并填充其单元格

1.创建一个自定义UItableViewCell

XCode文件->新建->文件->可可触摸类->用您的单元格名称填充类,使用TableViewCell的子类,还请选择创建Xib文件,语言Swift->下一步-创建。

示例:CustomTableViewCell

1.为您的TableView注册UItableViewCell。

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

2.在您的Viewcontroller中实现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.在您的Viewcontroller中实现UITableViewDelegate。

extension ViewControllerFromXib:UITableViewDelegate {

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

        return UITableViewAutomaticDimension;

    }

}

同一项目中可以有许多情节提要。

我通常喜欢每个“主”屏幕有1个情节提要,可以很容易地通过编程实例化,也可以在IB中链接。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM