32

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

带有静态单元格的 TableView

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

我尝试让我的控制器成为 UITableViewController 的子类,但这无济于事——我仍然没有选择在 Attributes Inspector 中使用静态单元格。

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

我的猜测是,当您将 UITableViewController 添加到情节提要时,Xcode 会产生某种魔力,但当您将现有 xib 更改为从 UITableViewController 继承时不会。

有什么建议如何将带有静态单元格的表格视图添加到现有的 xib 中?

4

3 回答 3

45

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

为此,您可以创建一个带有单个视图控制器的 UIStoryboard 文件,该文件的文件所有者设置为您的自定义视图控制器子类。将 VC 的标识符设置为某个值。当你想要显示它时,获取故事板,然后通过从故事板创建 VC 来实例化视图控制器子类。

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

你可以像往常一样在你的应用程序中展示这个 VC。

这是开始使用故事板的好方法,无需转换整个应用程序即可使用它们。

于 2012-06-14T21:33:58.617 回答
27

这在没有故事板的情况下是可行的:

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

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

第 4 步的示例: 西布

于 2012-12-05T16:52:44.113 回答
0

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

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

可以indexPath使用属性indexPath.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
    }
}
于 2016-11-29T18:55:25.643 回答