【发布时间】:2013-10-01 07:44:34
【问题描述】:
我知道无法在 UIViewController 中包含静态表格视图内容的问题
我没有收到警告/错误,但他也没有编译。有什么诀窍吗?还是我必须使用旧方法?
提前致谢。
【问题讨论】:
-
不编译并且不出错几乎是不可能的-.-
-
请提供更多信息、代码示例等。否则我们无能为力。
标签: objective-c xcode
我知道无法在 UIViewController 中包含静态表格视图内容的问题
我没有收到警告/错误,但他也没有编译。有什么诀窍吗?还是我必须使用旧方法?
提前致谢。
【问题讨论】:
标签: objective-c xcode
更新:使用最新更新(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?
【讨论】:
有一种方法可以改善 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];
}
您将单元连接到插座集合的顺序将是您在运行应用程序时看到的顺序。
我可以考虑通过将它们的单元格链接到多个出口集合来支持多个部分。
【讨论】:
这是我的尝试:
我已经创建了容器视图和表视图控制器。然后我打开 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;
}
【讨论】:
Can 的解决方案确实在 XCode 5.1 中出现问题 :(
我找到了一个基于相同基本思想的解决方法,但不幸的是需要更多的参与:http://www.codebestowed.com/ios-static-tableview-in-uiviewcontroller/
总而言之,您可以将 TableViewCells 直接添加到视图(并从中创建 IBOutlets 等),但为了使它们正确“移动”到 TableView,您需要在代码中将它们从视图中删除,并且您还需要在 IB 中设置 Auto-Layout 约束。
【讨论】:
正如上面提到的 Dannie P,使用 IBOutletConnection 是可行的方法。进一步澄清这一点:
从静态表格视图中取出第一个单元格,然后按 ctrl+将其拖到 UITableViewController 中。在连接属性窗口中,选择连接下拉菜单中的 Outlet Collection。
你应该得到类似这样的代码:
@property (strong, nonatomic) IBOutletCollection(UITableViewCell) NSArray *cells;
接下来,按您希望它们出现在静态表格视图中的顺序,按住 ctrl+将所有其余单元格(一次一个)拖到您在上面创建的属性上。
【讨论】: