2017-08-25 131 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; 

    } 

}