2015-06-11 64 views
81

我想使用不同的自定義tableViewCells的UITableview。我的3個細胞是這樣的:UITableview與多個自定義單元格與Swift

  • Cell1:應該有一個圖像和一個標籤。
  • Cell2:應該有兩個標籤。 Cell3:應該有一天Picker。

我不想爲單元格編碼標籤。我如何在Swift中管理這個。我是否必須爲每個單元編寫我自己的類?我可以使用一個tableviewController嗎?我怎樣才能在不同的單元格中填充數據?

我想生成一個tableView,就像一個iOS設備的聯繫人應用程序。

回答

220

讓我先從回答你的問題開始。

我是否必須爲每個單元編寫自己的類?=>是的,我相信。至少,我會那樣做。

我可以使用一個tableviewController嗎?=>是的,你可以。但是,您也可以在View Controller中有一個表視圖。

如何在不同的單元格中填充數據? =>根據條件,可以將數據填充到不同的單元格中。例如,讓我們假設你想讓你的前兩行像第一種類型的單元格。因此,您只需創建/重用第一種類型的單元格並設置它的數據。我猜,當我向你展示屏幕截圖時,會更加清楚。

讓我給你一個在ViewController中使用TableView的例子。一旦你理解了主要概念,那麼你可以嘗試和修改任何你想要的。

第1步:創建3個自定義TableViewCells。我將它命名爲FirstCustomTableViewCell,SecondCustomTableViewCell,ThirdCustomTableViewCell。你應該使用更有意義的名字。

enter image description here

第2步:進入Main.storyboard和拖放一個TableView中您的視圖控制器內。現在,選擇表格視圖並轉到身份檢查器。將「原型單元格」設置爲3。在這裏,你剛剛告訴你的TableView你可能有3種不同的單元格。

enter image description here

第3步: 現在,選擇在你的TableView和身份檢查第一小區,把「FirstCustomTableViewCell」在自定義類字段,然後設置標識符爲「firstCustomCell」,在屬性檢查器。

enter image description here

enter image description here

做所有其他 - 設置分別的自定義類爲 「SecondCustomTableViewCell」 和 「ThirdCustomTableViewCell」 一樣。還將標識符連續設置爲secondCustomCell和thirdCustomCell。

步驟4:編輯自定義單元類並根據需要添加網點。我根據你的問題編輯它。

P.S:您需要將插座放在類定義下。

所以,在FirstCustomTableViewCell.swift,下

class FirstCustomTableViewCell: UITableViewCell { 

你乾脆把標籤和圖像視圖網點。

@IBOutlet weak var myImageView: UIImageView! 
@IBOutlet weak var myLabel: UILabel! 

,並在SecondCustomTableViewCell.swift,添加兩個標籤喜歡 -

import UIKit 

class SecondCustomTableViewCell: UITableViewCell { 

    @IBOutlet weak var myLabel_1: UILabel! 
    @IBOutlet weak var myLabel_2: UILabel! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
    } 
} 

和ThirdCustomTableViewCell.swift應該喜歡 -

import UIKit 

class ThirdCustomTableViewCell: UITableViewCell { 

    @IBOutlet weak var dayPicker: UIDatePicker! 

    override func awakeFromNib() { 
     super.awakeFromNib() 
    } 

    override func setSelected(selected: Bool, animated: Bool) { 
     super.setSelected(selected, animated: animated) 
    } 
} 

第5步:在您的視圖控制器,爲您的TableView創建一個Outlet並設置故事板的連接。另外,您需要在類定義中添加UITableViewDelegate和UITableViewDataSource作爲協議列表。 所以,你的類定義應該是喜歡 -

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

之後附上表格視圖的的UITableViewDelegate和UITableViewDatasource到控制器。在這一點上你的viewController.swift應該是喜歡 -

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 

P.S:如果你使用一個TableViewController,而不是一個視圖控制器內的TableView,你可以跳過這一步。

第6步:根據Cell類將單元格中的圖像視圖和標籤拖放。然後從故事板提供連接到他們的網點。

第7步:現在,在視圖控制器中寫入UITableViewDatasource所需的方法。

import UIKit 

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource { 

    @IBOutlet weak var tableView: UITableView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 
    } 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int { 
     return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 3 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     if indexPath.row == 0 { 
      let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "firstCustomCell") 
      //set the data here 
      return cell 
     } 
     else if indexPath.row == 1 { 
      let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "secondCustomCell") 
      //set the data here 
      return cell 
     } 
     else { 
      let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "thirdCustomCell") 
      //set the data here 
      return cell 
     } 
    } 

    override func didReceiveMemoryWarning() { 
     super.didReceiveMemoryWarning() 
    } 
} 
+0

我收到消息:「無法在func cellForRowAtIndexPath中將類型'UITableViewCell'(0x1dfbfdc)的值轉換爲'Projekt.TitelTableViewCell'(0x89568)」。我正在使用UITableViewController,併爲我的「TitelZelle」單元的身份檢查器中設置的自定義單元「TitelZelle」設置了一個「TitelTableViewCell」類。我需要做什麼? – Easyglider

+0

我鑄造了我的手機! TitelTableViewCell在我的自定義UI元素中填充這個單元格。 – Easyglider

+6

試試這個=>讓cell = tableView.dequeueReusableCellWithIdentifier(「TitelZelle」,forIndexPath:indexPath)作爲TitelTableViewCell – Natasha

-19

UITableViewController繼承UIViewController已經有UITableviewDataSource & UITableviewDelegate映射到自己。

您可能在ViewController中繼承UITableViewController或使用TableView。 之後,您必須實施UITableviewDataSource中聲明的所需方法(cellForRowAtIndexPathand numberOfRowsInSection)。

在故事板中,您還需要使用唯一的ID創建單元格原型。

有一些基本的單元格類型,例如(標題,副標題) - 如果您不需要特殊配置,也可以使用它們。

所以,對於選擇器,是的,你需要創建自己的自定義單元格。創建必要的自定義類UITableViewCell,持有日期選擇器並確保使用委託將想要的結果發回給您的ViewController

16

夫特3.0 +用最少的代碼更新

基本概念: 創建具有動態小區原型的表圖。爲每個單元格原型分配標識符並創建自定義表格視圖單元格類。在表視圖的委託方法中啓動並顯示自定義單元格。

1.故事板

拖動一個的tableView到您的視圖控制器創建細胞,原型細胞添加到它,然後放下UI元素到你的表視圖細胞,如果需要,適當加約束。

enter image description here

2.創建自定義UITableViewCell

下面的代碼添加到您的項目。我把它放在視圖控制器類的正上方。

class FirstTableCell: UITableViewCell { 
} 

class SecondTableCell: UITableViewCell { 
} 

class ThirdTableCell: UITableViewCell { 
} 

3.分配自定義類和標識符細胞原型

對於每個在故事板中細胞的原型,分配從步驟2中創建的自定義類,然後輸入一個唯一的標識符。

enter image description here

4.連接UI元素SWIFT代碼

控制拖動表視圖,並連接到視圖控制器類。控制拖動在步驟1中添加到單元格原型的UI元素,並連接到相應的表格視圖單元格類。

enter image description here

5.添加代碼視圖控制器和控制表視圖

讓您的視圖控制器符合表視圖委託

class YourViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

viewDidLoad,建立表視圖的代表和數據源。

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.tableView.dataSource = self 
    self.tableView.delegate = self 

} 

最後,按照最低要求添加兩個委託方法來控制您的表視圖。

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 3 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    if indexPath.row == 0 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "firstTableCell") as! FirstTableCell 
     // Set up cell.label 
     return cell 
    } else if indexPath.row == 1 { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "secondTableCell") as! SecondTableCell 
     // Set up cell.button 
     return cell 
    } else { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "thirdTableCell") as! ThirdTableCell 
     // Set up cell.textField 
     return cell 
    } 
} 

6.試試看吧:)

enter image description here

0

以上答案是最好的答案,但有原因讓這個問題噸。對於有這個問題的人來說,這是另一個可能的解決方案:

我的問題是我繼續看ViewController類而不是故事板視圖。所以我提到故事板單元是沒有意義的,因爲故事板沒有被使用。

我這樣做:

let viewControllerB = SubViewController() 
viewControllerB.passedData = diseases[indexPath.row].name 
navigationController?.pushViewController(viewControllerB, animated: true) 

,我需要做這樣的事情:

let storyBoard : UIStoryboard = UIStoryboard(name: "Main", bundle:nil) 
let nextViewController = storyBoard.instantiateViewController(withIdentifier: "SubViewStoryboardController") as! SubViewController 
nextViewController.passedData = diseases[indexPath.row].name 
self.present(nextViewController, animated:true, completion:nil) 

希望這可以幫助別人。

相關問題