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 设备)?