我之前没有使用过故事板。
我想设计一个自定义表格视图单元格,并希望使用界面构建器。
我创建了一个故事板并放置了一个viewController(自定义类)并将自定义单元格放在其下。
我还连接了电池标签的插座。
但是,当我尝试访问标签时,它始终为零。
我使用以下代码来实例化代码,我怀疑这是我失败的地方。
我觉得我应该以某种方式告诉我想要来自故事板的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放在界面构建器的故事板中之外,我如何通知故事板他有这个viewcontroller?
**编辑2 **
答案>您应该在interfacebuilder中为viewcontroller设置Storyboard ID。
现在我回到原来的位置,细胞的标签是零..
**编辑3 **
答案>因此,当您使用interfacebuilder时,不应该有self.tableView.registerClass(ThreadTempDataTableViewCell.self, forCellReuseIdentifier: "ThreadTempDataTableViewCell")
。
我为IB中的表格视图单元格的类字段设置了ThreadTempDataTableViewCell
,并使用它如下所示。
let cellIdentifier = "ThreadTempDataTableViewCell"
let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as! ThreadTempDataTableViewCell
答案 0 :(得分:1)
如果要使用instantiateViewControllerWithIdentifier:
,请确保在Interface Builder中设置了正确的标识符。您可以在Interface Builder中的ViewController的Identity检查器中找到它。
我猜您已在Cell的类中声明了该标签并尝试访问它。如果您这样做,请确保已将单元格的类设置为您的类,并在Interface Builder中正确链接属性插座。
答案 1 :(得分:1)
我可以看到几个问题。所以,我将给你一步一步的指导。我的理解是你想拥有一个View Controller,它将保存一个Table View,并且在Table View中,你想拥有一个自定义的TableView Cell。
因此,除了尝试错误地实例化ViewController之外,我觉得还有一件事。你需要一个TableView来保存你的TableView Cell。
所以,以下是您需要考虑的步骤:
第1步:在故事板中拖动视图控制器。就我而言,我的故事板的名称是“Main”。
因此,只需了解如何使用storyboard标识符加载ViewController -
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
ThreadTempDatasViewController *threadTempDatasViewController = [storyboard instantiateViewControllerWithIdentifier:@"ThreadTempDatasViewController"];
[self.navigationController pushViewController: threadTempDatasViewController animated: NO];
所以,回到向View Controller添加对象 - 现在将UITableView拖放到UIViewController的视图中。然后将UITableViewCell拖放到TableView中。
现在,选择TableViewCell进行扩展,并将UILabel拖放到TableViewCell的内容视图中。
视图层次结构看起来像这样 -
所以,你现在拥有了所有对象。
第2步:为您的View Controller提供ID“ThreadTempDatasViewController”,并从故事板中的Identity检查器分配其类(ThreadTempDatasViewController)。
第3步:选择TableViewCell并设置它的ReuseIdentifier,即你的情况下为“ThreadTempDataTableViewCell”,你不必注册以编程方式识别的单元格。
另外不要忘记分配它的自定义类,在你的情况下是“ThreadTempDataTableViewCell”
第4步: 选择自定义TableViewCell并将插座连接到所需的UI对象。因此,将必须在ThreadTempDataTableViewCell.h类中声明的UILabel的Outlet与单元格内的storyboard中的标签连接起来。
例如,如果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
希望这有帮助。