【问题标题】:Static table view inside UIViewController [Xcode 5]UIViewController [Xcode 5] 中的静态表格视图
【发布时间】:2013-10-01 07:44:34
【问题描述】:

我知道无法在 UIViewController 中包含静态表格视图内容的问题

我没有收到警告/错误,但他也没有编译。有什么诀窍吗?还是我必须使用旧方法?

提前致谢。

【问题讨论】:

  • 不编译并且不出错几乎是不可能的-.-
  • 请提供更多信息、代码示例等。否则我们无能为力。

标签: objective-c xcode


【解决方案1】:

更新:使用最新更新(Xcode 5.1)似乎不再可能将静态单元格放入常规 UIViewController 中。我的回答仍然适用于 UITableViewController。


是的,您可以在 UIViewController 中拥有静态表格视图内容。

您需要做的就是:

-在界面生成器中创建表格的静态单元格并按照您喜欢的方式设计它们。

-使UIViewController实现table view的数据源和delegate:

@interface MyViewController : UIViewController<UITableViewDataSource, UITableViewDelegate>

-将table view的delegate和dataSource连接到interface builder中的view controller

-实现-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 以返回单元格的数量。 (例如return 10,就是这么简单)

- 将您的单元格连接到您的代码作为 Interface Builder 中的 IBOutlets。 重要提示:确保他们是strong,weak 将不起作用。例如@property (strong, nonatomic) IBOutlet UITableViewCell *myFirstCell;

-实现-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 以在索引路径处返回正确的单元格。例如:

int num = indexPath.row;
UITableViewCell *cell;
switch (num) {
    case 0:
        cell = self.myFirstCell;
        break;
    case 1:
        cell = self.mySecondCell;
        break;
}
return cell;

如果您应用所有这些步骤,您应该拥有适用于单元格不多的表格的工作静态单元格。非常适合您拥有少量(可能不超过 10-20 个就足够了)内容的表格。几天前我遇到了同样的问题,我确认它有效。有关我的答案的更多信息:Best approach to add Static-TableView-Cells to a UIViewcontroller?

【讨论】:

  • 所以我必须创建单元格,因为 IBOutlets 连接它们,然后创建 IBOutlets 来连接静态单元格内的东西?
  • 这个很棒的解决方法可能会在新的 xcode 5.1 beta 中被打破。我收到“非法配置”错误:“静态表视图仅在嵌入 UITableViewController 实例时有效”
  • 当 XCode 允许这种情况发生时真是太搞笑了,对吧?我的意思是我们必须将内容类型从动态原型设置为静态单元格并按照我们的意愿执行我们的静态单元格,但是在引用 UIViewController 中,大多数 UITableView 方法都可以工作,以便让我们操纵 UITableView 的内容! :) 谢谢你的好黑客!以这种方式完成这件事真的很值得! :) (Y)
  • 不适用于 XCode 6,但适合初学者
  • 有一个解决方法,但它有点脏。将 UIViewController 拖到 Storyboard 中。将 CONTAINER VIEW 拖到您希望 STATIC 表所在的控制器内。删除为您创建的 Segue 和 View the container 视图。将 UITableViewControler 拖到场景中,将其设置为 STATIC 单元格,然后 CTRL+单击从 CONTAINER VIEW 到 UITableViewController 并选择 EMBED。太棒了!肮脏但漂亮。
【解决方案2】:

有一种方法可以改善 Can 的答案。

将您的单元格连接到代码不是IBOutlet,而是IBOutletCollection。如果您将其命名为例如你的代码看起来像这样的单元格,这使得它稍微干净一些:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return self.cells.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return self.cells[indexPath.row];
}

您将单元连接到插座集合的顺序将是您在运行应用程序时看到的顺序。

我可以考虑通过将它们的单元格链接到多个出口集合来支持多个部分。

【讨论】:

  • 是的,更好/更干净!
  • 如果单元格在情节提要中指定了高度,您还需要 tableView:heightForRowAtIndexPath:。从单元格的边界获取高度。
【解决方案3】:

这是我的尝试:

我已经创建了容器视图和表视图控制器。然后我打开 Storyboard 的源代码并将容器视图的目标标识符更改为表视图容器标识符。现在将表格视图控制器设为静态...

更新:

只需 Ctrl+Drag 从 ContainerView 到 UITableViewController!

更新 2:

MYStaticTableViewController一样将嵌入式视图控制器类设置为smith,女巫应该只有这个方法来提供-prepareForSegue对父视图控制器的调用:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([self.parentViewController respondsToSelector:@selector(prepareForSegue:sender:)])
        [self.parentViewController prepareForSegue:segue sender:sender];
}

更新 3:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if ([self.parentViewController respondsToSelector:@selector(shouldPerformSegueWithIdentifier:sender:)])
        return [self.parentViewController shouldPerformSegueWithIdentifier:identifier sender:sender];
    return YES;
}

【讨论】:

    【解决方案4】:

    Can 的解决方案确实在 XCode 5.1 中出现问题 :(

    我找到了一个基于相同基本思想的解决方法,但不幸的是需要更多的参与:http://www.codebestowed.com/ios-static-tableview-in-uiviewcontroller/

    总而言之,您可以将 TableViewCells 直接添加到视图(并从中创建 IBOutlets 等),但为了使它们正确“移动”到 TableView,您需要在代码中将它们从视图中删除,并且您还需要在 IB 中设置 Auto-Layout 约束。

    【讨论】:

      【解决方案5】:

      正如上面提到的 Dannie P,使用 IBOutletConnection 是可行的方法。进一步澄清这一点:

      从静态表格视图中取出第一个单元格,然后按 ctrl+将其拖到 UITableViewController 中。在连接属性窗口中,选择连接下拉菜单中的 Outlet Collection。

      你应该得到类似这样的代码:

      @property (strong, nonatomic) IBOutletCollection(UITableViewCell) NSArray *cells;
      

      接下来,按您希望它们出现在静态表格视图中的顺序,按住 ctrl+将所有其余单元格(一次一个)拖到您在上面创建的属性上。

      【讨论】:

        猜你喜欢
        • 2016-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        • 2014-04-17
        • 2013-07-13
        相关资源
        最近更新 更多