UITableview与多个自定义单元格与Swift

我想用不同的自定义tableViewCells的UITableview。 我的3个细胞是这样的:

  • Cell1:应该有一个图像和一个标签。
  • Cell2:应该有两个标签。
  • Cell3:应该有一天的Picker。

我不想为单元格编码标签。 我如何在Swift中pipe理这个 我是否必须为每个单元格编写自己的类? 我可以使用一个tableviewController吗? 我如何在不同的单元格中填充数据?

我想生成一个tableView,就像一个iOS设备的联系人应用程序。

让我先从回答你的问题开始。

我是否必须为每个单元格编写自己的类?=>是的,我相信。 至less,我会那样做的。

我可以使用一个tableviewController?=>是的,你可以。 但是,您也可以在View Controller中有一个表格视图。

我如何在不同的单元格中填充数据? =>根据条件,可以将数据填充到不同的单元格中。 例如,让我们假设你想要你的前两行像第一种types的单元格。 所以,你只需要创build/重用第一种types的单元格并设置它的数据。 我猜,当我向你展示屏幕截图时,会更加清楚。

让我给你一个ViewController中的TableView的例子。 一旦你明白了主要概念,那么你可以尝试和修改任何你想要的。

第1步:创build3个自定义TableViewCells。 我将它命名为FirstCustomTableViewCell,SecondCustomTableViewCell,ThirdCustomTableViewCell。 你应该使用更有意义的名字。

在这里输入图像描述

第2步:转到Main.storyboard并将TableView拖放到View Controller中。 现在,select表视图并转到身份检查器。 将“原型单元格”设置为3.在这里,您刚刚告诉您的TableView,您可能有3种不同的单元格。

在这里输入图像描述

步骤3:现在,在TableView中select第一个单元格,在身份检查器中,将“FirstCustomTableViewCell”放在Custom类字段中,然后在属性检查器中将标识符设置为“firstCustomCell”。

在这里输入图像描述

在这里输入图像描述

对所有其他人一样 – 分别将其自定义类设置为“SecondCustomTableViewCell”和“ThirdCustomTableViewCell”。 还将标识符连续设置为secondCustomCell和thirdCustomCell。

第四步:编辑自定义单元类,并根据需要添加网点。 我根据你的问题编辑它。

PS:你需要把网点放在class级定义之下。

所以,在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步:在你的ViewController中,为你的TableView创build一个Outlet,并设置Storyboard的连接。 此外,您需要在类定义中添加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() } } 

PS:如果您要在ViewController中使用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() } } 

Swift 3.0更新与最小代码

基本概念:使用dynamic单元格原型创build表视图。 分配标识符并为每个单元格原型创build自定义表格视图单元格类。 在表视图的委托方法中启动并显示自定义单元格。

1.在故事板上创build单元格

拖一个tableView到你的视图控制器,添加原型单元格,然后将UI元素拖放到你的表格视图单元格中,如果需要,可以正确添加约束。

在这里输入图像描述

2.创build自定义的UITableViewCell

将下面的代码添加到您的项目。 我把它放在视图控制器类的正上方。

 class FirstTableCell: UITableViewCell { } class SecondTableCell: UITableViewCell { } class ThirdTableCell: UITableViewCell { } 

3.将自定义类和标识符分配给单元格原型

对于故事板中的每个单元格原型,分配从步骤2创build的自定义类,然后input唯一标识符。

在这里输入图像描述

4.将UI元素连接到swift代码

控制拖动表视图并连接到视图控制器类。 控制拖动在步骤1中添加到单元格原型的UI元素,并连接到相应的表格视图单元格类。

在这里输入图像描述

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.试试看:)

在这里输入图像描述

以上的答案是最好的答案,但有理由得到这个问题吨。 对于有这个问题的人来说,这是另一个可能的解

我的问题是,我inheritance了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) 

希望这有助于某人。

UITableViewControllerinheritance已经有UITableviewDataSourceUITableviewDelegate映射到自己的UIViewController

你可以UITableViewController或者在ViewController使用TableView 。 之后,您必须实现在UITableviewDataSource中声明的所需方法( cellForRowAtIndexPath and numberOfRowsInSection )。

同样在故事板中,您需要使用唯一的ID创build单元格原型。

有基本的单元格types,例如(标题,副标题) – 如果不需要特殊configuration,也可以使用它们。

所以,对于select器,是的,你需要创build自己的自定义单元格。 创build必要的自定义UITableViewCell类持有dateselect器,并确保使用委托发回所需的结果回您的ViewController