簡體   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