在XIB文件中添加带有动态内容的UITableView

its*_*e69 9 interface-builder uitableview xib

有没有办法在另一个视图中添加UITableView(不是a Table View Controller,而是一个TableView)并将其内容设置"Dynamic Prototype"XIB file

UITableView在视图控制器中添加一个时,这可以正常工作storyboard.但是,当我尝试在XIB文件中执行相同操作时,我无法将其内容设置为"Dynamic Prototype".

Tom*_* C. 5

更新

最近在思考这个问题,有一个相当简单的解决方案,那就是使用容器视图模式。

  1. 基本上,将容器视图添加到您的 xib(或故事板)。
  2. 选择默认附加到容器视图的视图控制器。
  3. 删除选定的视图控制器并将法线uitableviewcontroller拖入 IB 画布。
  4. 接下来,从容器视图中按住 Control 拖动到uitableviewcontroller并从可用的 segues 类型中选择“嵌入”。
  5. 根据您的喜好调整容器视图的大小,并为表视图控制器创建适当的代码文件。
  6. 将 重构uitableviewcontroller为单独的故事板/xib。

注意- 表视图控制器可以作为在代码中保存容器视图的视图控制器的子视图控制器进行访问。

为什么这是正确的模式?1 个故事板,1 个控制器。TableView 有它自己的控制器,因为它足够复杂,需要一个单独的控制器。使用容器视图模式允许您维护单一职责模式。避免控制器膨胀。

原始答案的解决方法

如果您调整 tableview 的大小,请注意一个问题;xml 将由 Xcode 重新生成,并要求您重新添加该属性。我已经确认这个编辑在 9.3+ 版本中仍然有效。https://github.com/mingsai/test-stub-tableviewdynamic-inxib.git提供了一个示例存根。

原答案

  1. 打开文件导航器
  2. 右键单击 YourCustomView.xib 文件
  3. 打开为 > 源代码

开放式

  1. 查找以开头的 XML

tableview-xml

  1. 在 XMLtableview标记中找到 style 属性
  2. 在style标签前留空,粘贴进去 dataMode="prototypes"


小智 3

对此不是 100% 确定,但我认为没有办法在 XIB 文件中将 UITableView 内容设置为“动态原型”。

但是,您可以通过创建另一个 XIB 文件(名为“MyTableViewCell.xib”)来实现相同的功能,该文件仅包含 UITableViewCell,为单元格提供标识符,转到文件的所有者并在身份检查器中将其设置为相同的视图控制器类作为您的表视图 xib,然后在您的视图控制器中创建一个 IBOutlet,如下所示:

 @property (nonatomic, assign) IBOutlet UITableViewCell *customCell;
Run Code Online (Sandbox Code Playgroud)

然后在 XIB 中,单击文件的所有者并按住 Control 键拖动到 uitableviewcell 并将单元格的出口设置为“customCell”属性。

(如果您在图形编辑器左下角的圆圈内找到看起来像播放按钮的按钮,单击它,然后在该列中进行拖动,这可能会更容易完成)。

毕竟,在 cellForRowAtIndexPath 中使用类似于以下的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{

    static NSString *CellIdentifier = @"CustomCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCell" owner:self options:nil];

        cell = customCell;
    }

    // Other cell configurations....
}
Run Code Online (Sandbox Code Playgroud)

希望这是有道理的并且适合您的需求!