UITableViewCell设计的故事板

storyboard for UITableViewCell designing

我以前没有用过故事板。

我想设计一个自定义 table 视图单元格,并想用界面生成器来完成。

我创建了一个故事板并放置了一个 viewController(自定义 class)并将自定义单元格放在它下面。

我还连接了电池标签的插座。

但是,当我尝试访问标签时,它始终为零。

我正在使用以下代码来实例化代码,我怀疑这是我失败的地方。

我觉得我应该以某种方式告诉我我想要情节提要中的 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 () doesn't contain a view controller with identifier 'ThreadTempDatasViewController'

那么除了将 viewcontroller 放在 interfacebuilder 的故事板中之外,我如何通知故事板他有这个 viewcontroller?

** 编辑 2 **

answer> 您应该在 interfacebuilder 中为 viewcontroller 设置 Storyboard ID。

现在我回到原来的位置,单元格的标签为零..

** 编辑 3 **

answer> 所以您在使用 interfacebuilder 时不应该 self.tableView.registerClass(ThreadTempDataTableViewCell.self, forCellReuseIdentifier: "ThreadTempDataTableViewCell")

我在 IB 中为 table 视图单元格的 class 字段设置了 ThreadTempDataTableViewCell,并按如下方式使用它。

 let cellIdentifier = "ThreadTempDataTableViewCell"
 let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ThreadTempDataTableViewCell

当您想使用 instantiateViewControllerWithIdentifier: 时,请确保您已在 Interface Builder 中设置正确的标识符。您可以在 Interface Builder 中的 ViewController 身份检查器中找到它。

我猜你已经在 Cell 的 class 中声明了标签并尝试访问它。如果这样做,请确保已将单元格的 class 设置为 class 并在 Interface Builder 中正确设置属性出口 link。

我可以看到几个问题。因此,我将逐步指导您。我的理解是你想要一个 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];

所以,回到将对象添加到您的视图控制器 - 现在将 UITable 视图拖放到 UIViewController 的视图中。然后将 UITableViewCell 拖放到 TableView 中。

现在,select TableViewCell 展开并拖放 UILabel 到 TableViewCell 的内容视图中。

视图层次结构看起来像这样-

所以,你现在已经拥有了所有的对象。

第 2 步: 为您的视图控制器提供 ID,"ThreadTempDatasViewController" 并从身份检查器中分配其 class(ThreadTempDatasViewController)你的故事板。

第 3 步: Select TableViewCell 并设置它的 ReuseIdentifier,在你的情况下是 "ThreadTempDataTableViewCell" 这样,你就赢了'不必注册以编程方式识别的单元格。

另外不要忘记分配其自定义 class,在您的情况下是 "ThreadTempDataTableViewCell"

第 4 步: Select 您的自定义 TableViewCell 并将插座与所需的 UI 对象连接起来。因此,将必须在 ThreadTempDataTableViewCell.h class 内声明的 UILabel 的 Outlet 与单元格内情节提要中的标签连接起来。

例如,如果 ThreadTempDataTableViewCell.h 有一个名为 "threadTempDataLAbel" 的 UI 标签的出口,它将类似于 -

@interface ThreadTempDataTableViewCell : UITableViewCell

@property(nonatomic, strong) IBOutlet UILabel *threadTempDataLAbel;

@end

现在 select 故事板中的 ThreadTempDataTableViewCell,然后转到身份检查器中的最后一个图标,并连接到插座。

连接后,您会看到类似-

的内容

为了清楚起见,您还应该在 ViewController 中有一个 TableView 的 IBOutlet。

#import <UIKit/UIKit.h>

@interface ThreadTempDatasViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>

@property(nonatomic, strong) IBOutlet UITableView *myTableView;

@end

现在,select 故事板中的 ViewController 并像以前一样转到最后一个选项卡并连接到 table 视图的出口。

嗯,这应该是您需要的所有设置。现在您可以跳转到您的代码以填充 table 或访问 TableViewCell 的 属性(threadTempDataLabel)

我认为,您无法访问 UILabel 的原因是您试图在 ViewController 中设置 TableViewCell 而不是 Table视图或者如果你有一个Table视图,你可能忘记了将数据源设置为视图控制器。这是完整的代码。

#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

希望这对您有所帮助。