问题:在带有表视图的xib中创建了一个视图控制器。但是,表格视图非常奇怪,并且看起来不像我们在故事板中使用的表格视图。
我的计划是使用我在另一个xib文件中创建的自定义表格视图单元格填充此表格视图。但是,遗憾的是,它没有像我预期的那样工作,因为一切都已关闭并且那些单元格被实例化,我知道我的自定义单元格可以工作,因为它在我在故事板中创建的其他视图控制器中工作:
我想要一种方法来设计我的视图控制器,以便我可以在需要时实例化它们,我的理由是我不想拥有一个人工填充的故事板。现在我知道我不能在xib文件中使用表格视图,就像我们在故事板中使用它一样。有没有解决这个问题?我需要另一个故事板来实现这个目标吗?
答案 0 :(得分:1)
是的,您可以在应用程序中使用尽可能多的故事板。
我尝试为每个工作流程设置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")!
视图控制器有两种基本方法可以访问另一个故事板中的第二个视图控制器。
在故事板中,使用Storyboard Reference到第二个视图控制器,然后使用show segue推送第二个视图控制器。
在视图控制器的源代码中,使用instantiateInitialViewController()
或instantiateViewController(withIdentifier:)
创建第二个视图控制器并将其推送到导航控制器。
答案 1 :(得分:1)
任务1.加载UIViewcontroller表单Xib
我们可以加载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。打开新创建的控制器
let controller = ViewControllerFromXib.init()
self.present(controller, animated: true, completion: nil)
以上述方式,我们可以从XIB加载UIViewcontroller。
任务2.创建一个tableview&amp;使用自定义xib填充它的单元格
<强> 1。创建自定义UItableViewCell
XCode文件 - &gt;新 - &gt;档案 - &gt; Cocoa Touch Class - &gt;使用您的单元名称填充Class,使用TableViewCell填充子类,选中同时创建Xib文件,语言Swift - &gt;下一步 - 创建。
示例: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实现到Viewcontroller中
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 :(得分:0)
您可以在同一个项目中拥有多个故事板。
我通常喜欢每个“主”屏幕有1个故事板,这很容易以编程方式实例化,也可以在IB中链接。
至于你的问题,我建议你的自定义uitableviewcell在.xib文件中创建。作为一个独立的观点。通过这种方式,您可以将代码注册为所需视图控制器的“可重用单元”,而不管包含它的故事板如何。