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

时间:2012-06-14 21:00:46

标签: ios uitableview

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

TableView with static cells

但是当我将UITableView拖到我的屏幕上时,我没有在属性检查器中使用“Content> Static”菜单。

我已经尝试制作我的控制器子类UITableViewController,但这没有用 - 我仍然没有选择在Attributes Inspector中使用静态单元格。

我查看了StackOverflow,但没有找到这个问题的任何现有答案。所有现有问题都与故事板(我没有使用)有关,而不是与xib文件有关。

我的猜测是,当你将一个UITableViewController添加到一个故事板时,Xcode会产生某种魔力,但是当你将现有的xib更改为继承自UITableViewController时,它不会。

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

3 个答案:

答案 0 :(得分:45)

静态表格视图单元格仅在使用故事板时可用。但是,如果您没有为整个UI使用故事板,您仍然可以将它们用于单个屏幕而不是屏幕集合。

要执行此操作,您可以创建一个UIStoryboard文件,其上有一个视图控制器,其文件所有者设置为您的自定义视图控制器子类。将VC的标识符设置为某个值。如果要显示它,请获取故事板,然后通过从故事板创建VC来实例化视图控制器子类。

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

您可以像往常一样在自己的应用中展示此VC。

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

答案 1 :(得分:26)

没有故事板,这是可行的:

  1. 您的控制器必须采用tableview委托和协议 source ... UITableViewDelegate,UITableViewDataSource
  2. 将表格视图添加到.xib;将表格视图的样式设置为“分组”
  3. 将表格连接到控制器中的属性(我们称之为“yourTableView”)
  4. 将表格视图单元格添加到.xib作为单独的视图...即。 作为表视图的子视图......它们将自由浮动在.xib中。 (见下面的示例图片)
  5. 向表格单元格添加控件/标签等。
  6. 为每个表格视图单元格的“属性”中的“标识符”字段指定唯一字符串。
  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:中的
  12. ,返回yourFirstCell,yourSecondCell等指针以获取适当的indexPath值
  13. 表格单元格控件的事件应该转到处理程序例程......

    第4步的示例: xib

答案 2 :(得分:0)

为了扩展BVB的答案,当涉及到10号时,这里是您的tableview委托方法的Swift 3片段。请务必在xib中的所有单元格中添加插座。

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

可以使用indexPathindexPath.row属性从indexPath.section中提取值。使用这些值,您可以按照您喜欢的顺序手动构建IBOutlets中的部分。

@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
    }
}