如何在不使用Storyboard的情况下在UITableView中使用静态单元?

我在我的项目中有一个现有的ViewController + xib,现在我想添加一个UITableView静态单元格,如下所示:

带有静态单元格的TableView

但是,当我将一个UITableView拖到我的屏幕上时,我没有属性检查器中的“内容>静态”菜单。

我试过让我的控制器子类UITableViewController,但是这并没有帮助 – 我仍然没有得到在属性检查器中使用静态单元格的选项。

我浏览过StackOverflow,但没有发现任何现有的答案这个问题。 所有现有的问题与故事板(我没有使用),而不是xib文件。

我的猜测是,当你添加一个UITableViewController到故事板,而不是当你改变一个现有的Xib从UITableViewControllerinheritance时,Xcode会做某种魔术。

任何build议如何将静态单元格的表视图添加到现有的xib?

静态表格视图单元格仅在使用故事板时可用。 但是,如果您不使用整个用户界面的故事板,则仍然可以将它们用于单个屏幕而不是一组屏幕。

要做到这一点,你可以创build一个UIStoryboard文件,并将其文件的所有者设置为你的自定义视图控制器的子类。 将VC的标识符设置为某个值。 当你想显示这个,获取故事板,然后通过从故事板创buildVC实例化你的视图控制器子类。

UIStoryboard *tableViewStoryboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil]; CustomViewController = [tableViewStoryboard instantiateViewControllerWithIdentifier:@"custom identifier"]; 

您可以像往常一样在您的应用程序中呈现这个VC。

这是开始使用故事板而不必转换整个应用程序以使用它们的好方法。

这是可行的没有故事板:

  1. 你的控制器必须采用tableview委托和源协议… UITableViewDelegate,UITableViewDataSource
  2. 添加一个表视图到你的.xib; 将表视图的样式设置为“分组”
  3. 将表连接到控制器中的属性(我们称之为“yourTableView”)
  4. 将表视图单元格添加到.xib作为单独的视图…即不是作为表视图的子视图…他们将自由浮动在.xib中。 (请参阅下面的示例图片)
  5. 将控件/标签等添加到表单元格。
  6. 为每个表视图单元格的属性中的“标识符”字段分配唯一的string。
  7. 将表格单元格连接到控制器中的其他属性(sliderCell,switchCell等)
  8. 将单元格控件的发送事件连接到控制器中的IBAction-ed方法 – (IBAction)handleSliderCell等
  9. 在控制器的viewDidLoad方法中,将表视图的委托和来源分配给控制器(self.yourTableControl.delegate = self; self.yourTableControl.dataSource = self;)
  10. 在控制器中实现numberOfSectionsInTableView,numberOfRowsInSection和cellForRowAtIndexPath
  11. 在tableView:cellForRowAtIndexPath :,返回yourFirstCell,yourSecondCell等指针适当的indexPath值

表单元格控件的事件应该转到处理程序例程中。

步骤4的示例: 厦门国际银行

为了扩展BVB的答案,当涉及到数字10,这里是您的tableview委托方法的Swift 3片段。 确保将sockets添加到xib中的所有单元。

当你手动创build你的表视图部分时,记住indexPath等于表示你的表结构的二维数组。 例如,当indexPath传递给tableView(cellForRowAt indexPath: IndexPath)等于[1][0] ,您的单元格将被放置在第二部分的第一个位置。

可以使用属性indexPath.rowindexPath.section将值从indexPath提取出来。 使用这些值,您可以从您的IBOutlet中以您喜欢的任何顺序手动构build您的部分。

 @IBOutlet var is_enabled: UITableViewCell! @IBOutlet var is_public: UITableViewCell! func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? { switch(section){ case 0: return "Cell 1" case 1: return "Cell 2" default: return "" } } func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } func numberOfSections(in tableView: UITableView) -> Int { return 2 } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { print("index path here", indexPath) if(indexPath.section == 0) { return is_enabled } else if(indexPath.section == 1) { return is_public } else { return is_enabled } }