UITableViewCell 设计的故事板
Posted
技术标签:
【中文标题】UITableViewCell 设计的故事板【英文标题】:storyboard for UITableViewCell designing 【发布时间】:2015-11-10 07:30:18 【问题描述】:我以前没用过故事板。
我想设计一个自定义表格视图单元格,并希望使用界面生成器来完成。
我创建了一个故事板并放置了一个 viewController(自定义类)并将自定义单元格放在它下面。
我还连接了单元格标签的插座。
但是,当我尝试访问标签时,它总是为零。
我正在使用以下代码来实例化代码,我怀疑这就是我失败的地方。
我觉得我应该以某种方式告诉我想要故事板中的视图控制器,不是吗?
ThreadTempDatasViewController* threadTempDatasViewController = [[ThreadTempDatasViewController alloc] init];
[self.navigationController pushViewController: threadTempDatasViewController animated: NO];
** 编辑 **
我现在有
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"ThreadTempData" bundle:nil];
ThreadTempDatasViewController *threadTempDatasViewController = [storyboard instantiateViewControllerWithIdentifier:@"ThreadTempDatasViewController"];
[self.navigationController pushViewController: threadTempDatasViewController animated: NO];
我得到错误
Storyboard () 不包含视图 标识符为“ThreadTempDatasViewController”的控制器
那么除了将viewcontroller放在interfacebuilder的storyboard中之外,我如何通知storyboard他有这个viewcontroller呢?
** 编辑 2 **
answer> 您应该在 interfacebuilder 中为 viewcontroller 设置 Storyboard ID。
现在我回到了原来的位置,单元格的标签是 nil..
** 编辑 3 **
answer> 所以在使用 interfacebuilder 时不应使用 self.tableView.registerClass(ThreadTempDataTableViewCell.self, forCellReuseIdentifier: "ThreadTempDataTableViewCell")
。
我在 IB 中为表格视图单元格的类字段设置了ThreadTempDataTableViewCell
,并像下面这样使用它。
let cellIdentifier = "ThreadTempDataTableViewCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ThreadTempDataTableViewCell
【问题讨论】:
您是否在情节提要中激活了您的视图控制器(单击它),并在身份检查器的右侧窗格中设置情节提要 ID? 【参考方案1】:我可以看到几个问题。所以,我要给你一步一步的指导。我的理解是你想要一个 View Controller 来保存一个 Table View,并且在这个 Table View 内部,你想要一个自定义的 TableView Cell。
所以,除了尝试错误地实例化 ViewController 之外,我觉得还有一件事。您需要有一个 TableView 来保存您的 TableView Cell。
所以,以下是您需要考虑的步骤:
第 1 步: 在情节提要中拖动一个视图控制器。就我而言,我的故事板的名称是“Main”。
所以,请注意如何使用情节提要标识符加载 ViewController-
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ThreadTempDatasViewController *threadTempDatasViewController = [storyboard instantiateViewControllerWithIdentifier:@"ThreadTempDatasViewController"];
[self.navigationController pushViewController: threadTempDatasViewController animated: NO];
所以,回到将对象添加到您的视图控制器 - 现在将 UITableView 拖放到 UIViewController 的视图中。然后在 TableView 中拖放一个 UITableViewCell。
现在,选择 TableViewCell 以展开并将 UILabel 拖放到 TableViewCell 的内容视图中。
视图层次结构看起来像这样-
所以,你现在已经拥有了所有的对象。
第 2 步:为您的视图控制器提供 ID“ThreadTempDatasViewController”,并从情节提要中的身份检查器分配其类 (ThreadTempDatasViewController)。
第 3 步:选择 TableViewCell 并将其设置为 ReuseIdentifier,在您的情况下为“ThreadTempDataTableViewCell”,您不必注册以编程方式识别的单元格。
也不要忘记分配它的自定义类,在你的例子中是“ThreadTempDataTableViewCell”
第 4 步: 选择您的自定义 TableViewCell 并将插座与所需的 UI 对象连接起来。因此,将必须在 ThreadTempDataTableViewCell.h 类中声明的 UILabel 的 Outlet 与单元格内情节提要中的标签连接起来。
例如,如果 ThreadTempDataTableViewCell.h 有一个名为“threadTempDataLAbel”的 UILabel Outlet,它将类似于-
@interface ThreadTempDataTableViewCell : UITableViewCell
@property(nonatomic, strong) IBOutlet UILabel *threadTempDataLAbel;
@end
现在在情节提要中选择 ThreadTempDataTableViewCell,然后转到身份检查器中的最后一个图标,并连接到您的插座。
连接后,你会看到类似-
为了清楚起见,您的 ViewController 中还应该有一个 TableView 的 IBOutlet。
#import <UIKit/UIKit.h>
@interface ThreadTempDatasViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>
@property(nonatomic, strong) IBOutlet UITableView *myTableView;
@end
现在,在故事板中选择 ViewController 并像之前一样转到最后一个选项卡并连接 tableView 的插座。
嗯,这应该是您需要的所有设置。现在您可以跳转到代码中来填充表格或访问 TableViewCell 的属性(threadTempDataLabel)
我认为,您无法访问 UILabel 的原因要么是因为您试图在 ViewController 中设置 TableViewCell 而不是 TableView,或者如果您有 TableView,您可能忘记将数据源设置为视图控制器。这是完整的代码。
#import "ThreadTempDatasViewController.h"
#import "ThreadTempDataTableViewCell.h"
@interface ThreadTempDatasViewController ()
@end
@implementation ThreadTempDatasViewController
- (void)viewDidLoad
[super viewDidLoad];
self.myTableView.dataSource=self;
self.myTableView.delegate=self;
- (void)didReceiveMemoryWarning
[super didReceiveMemoryWarning];
#pragma mark- TableView Datasource
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return 5;
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
ThreadTempDataTableViewCell *cell= [tableView dequeueReusableCellWithIdentifier:@"ThreadTempDataTableViewCell"];
cell.threadTempDataLAbel.text = @"test";
return cell;
@end
希望这会有所帮助。
【讨论】:
太棒了!如果您添加了我的 2 个编辑,这将是完整的教程。 1 表示我如何以编程方式加载视图控制器,2 表示不注册类。 谢谢,我在故事板的帮助下添加了如何加载视图控制器的编辑。关于注册单元格的类,如果您在情节提要中指定单元格的标识符属性,则不必这样做。【参考方案2】:当您想使用 instantiateViewControllerWithIdentifier:
时,请确保您在 Interface Builder 中设置了正确的标识符。您可以在 Interface Builder 中的 ViewController 的身份检查器中找到它。
我猜你已经在 Cell 的类中声明了标签并尝试访问它。如果您这样做了,请确保您已将单元格的类设置为您的类,并在 Interface Builder 中正确链接属性插座。
【讨论】:
请先告诉我如何获取单元格的代码和单元格的 IB 配置。以上是关于UITableViewCell 设计的故事板的主要内容,如果未能解决你的问题,请参考以下文章
更改 UITableViewCell 内 UIView 的高度(故事板)
从 UITableviewcell 移动到 ViewController 并使用故事板返回
带有故事板原型的 UITableViewCell 子视图的动态大小
UITableViewCell 故事板注册依赖于初始视图控制器?
UITableViewCell 子类布局在禁用自动布局的故事板中搞砸了
为啥 UITableViewCell.layoutSubviews() 的 frame.width 为 600(通用故事板宽度)而不是 320(特定 iPhone 设备)?