2017-08-25 133 views
1

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

enter image description here

我的计划是填充我在另一个XIB文件创建一个自定义的表视图单元格此表视图。但遗憾的是,它并不如我预料,因为一切都已经掉了,这些细胞被实例化的工作,我知道我的自定义细胞起作用,因为它在在故事板创建了其他视图控制器已工作:

]]]]]]

我想要一种方法来设计我的视图控制器,这样我就可以在需要时对它们进行实例化,我的理由是我不想拥有一个非常丰富的故事板。现在我知道我不能像在故事板中使用它那样在xib文件中使用表格视图。有没有解决这个问题?我是否需要另一个故事板来实现这一目标?

+0

你创建的东西看起来像一个表视图而不是一个表视图控制器。这就是他们与众不同的原因。另外,没有什么能够阻止你创建另一个故事板。随着项目的发展,这也非常普遍。 –

+0

嗨雨辰,这是为了表格视图而不是表格视图控制器。为什么人们在他们的项目中有更多的故事板,为什么它是有用的和常见的? –

+0

故事板是基于xml的,当有多个人在同一时间工作时,它可以很容易地导致冲突。冲突很难解决。另外,故事板渲染速度很慢,难以处理,因为它变得更复杂。所以,让它们变小会更容易。 –

回答

0

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

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

至于你的问题,我建议你的自定义uitableviewcell创建一个.xib文件。作为一个独立的观点。通过这种方式,您可以将其注册为任何您想要的视图控制器的“可重用单元格”,而不管包含它的故事板如何。

+0

我确实创建了自定义表格视图单元格。为什么会有许多故事板帮助你的工作流程?谢谢 –

+0

因为在处理大型项目时,很多人可以关注应用程序的各个部分。另外现在还没有什么缺点可以分解它们,因为故事板可以使用故事板引用相互链接,或者只需要一个以编程方式呈现所需故事板的管理类。这对于MVVM模式特别好,因为视图和它们的控制器几乎没有业务逻辑。 – Pochi

1

是的,您可以在应用程序中使用尽可能多的故事板。

我尝试为每个工作流程设置1个storyboard。然而,一些热情较低的故事板开发人员使用每个视图控制器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到第二视图控制器,然后使用一个节目SEGUE推动第二视图控制器。

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

+0

感谢您的回复,如果我的第一个故事板包含导航视图控制器,我的第二个故事板如何知道嵌入在第一个故事板中的导航控制器?换句话说,我该如何继续那个“导航”? –

+0

我更新了我的答案。 –

1

任务1.负载的UIViewController形式XIB

我们可以加载一个UIViewController形式XIB代替故事板。我们可以使用以下程序:

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) 

在这上面的方法,我们可以从厦门国际银行加载一个UIViewController。

任务2.创建一个实现代码如下&它使用电池定制厦门国际银行

1.创建一个自定义的UITableViewCell

的XCode文件填充 - >新建 - >文件 - >可可触摸类 - >用你的单元格名称填充类,使用TableViewCell的子类,检查另外创建Xib文件,Swift语言 - >下一步 - 创建。

例子:CustomTableViewCell

1.注册的UITableViewCell为您的TableView。

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; 

    } 

}