【问题标题】:Add UITableView with dynamic content in an XIB file在 XIB 文件中添加具有动态内容的 UITableView
【发布时间】:2012-12-18 18:39:03
【问题描述】:

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

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

【问题讨论】:

    标签: uitableview interface-builder xib


    【解决方案1】:

    更新

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

    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. 查找以

    1. 在 XML tableview 标记中找到样式属性
    2. 在样式标签前留一个空格,粘贴进去 dataMode="prototypes"

    【讨论】:

    • 你就是那个人。
    • 不确定这是否在最近的 Xcode 更新中发生了变化,但这对我不起作用:(
    • @Lewis42 - 我刚刚在最新版本的 Xcode 上测试了它,它仍然有效。请参阅我添加到 git repo 答案中的链接。此外,如果您在进行更改后调整 tableview 的大小,它将使用默认属性重写 xml。请参阅我关于此效果的更新说明。
    • 好答案。但是我是否应该担心苹果将来会删除这个黑客​​?我很犹豫在生产应用程序中使用这个技巧。
    • @MichaelVoline - 好点。请参阅修订后的答案。虽然我怀疑他们会改变 tableview 的 xml 定义,但一切皆有可能。我很久以前就停止这样做了,只是使用容器视图,因为它本来应该被使用(保存一个子视图控制器)。
    【解决方案2】:

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

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

     @property (nonatomic, assign) IBOutlet UITableViewCell *customCell;
    

    然后在 XIB 中,单击 File's Owner 并按住 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....
    }
    

    希望这有意义并适合您的需求!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      • 1970-01-01
      • 1970-01-01
      • 2014-10-17
      • 1970-01-01
      • 1970-01-01
      • 2014-09-13
      相关资源
      最近更新 更多