UITableViewCell设计的故事板

时间:2015-11-10 07:30:19

标签: ios uitableview storyboard

我之前没有使用过故事板。

我想设计一个自定义表格视图单元格,并希望使用界面构建器。

我创建了一个故事板并放置了一个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

2 个答案:

答案 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的内容视图中。

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

enter image description here

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

第2步:为您的View Controller提供ID“ThreadTempDatasViewController”,并从故事板中的Identity检查器分配其类(ThreadTempDatasViewController)。

enter image description here

第3步:选择TableViewCell并设置它的ReuseIdentifier,即你的情况下为“ThreadTempDataTableViewCell”,你不必注册以编程方式识别的单元格。

enter image description here

另外不要忘记分配它的自定义类,在你的情况下是“ThreadTempDataTableViewCell”

enter image description here

第4步: 选择自定义TableViewCell并将插座连接到所需的UI对象。因此,将必须在ThreadTempDataTableViewCell.h类中声明的UILabel的Outlet与单元格内的storyboard中的标签连接起来。

例如,如果ThreadTempDataTableViewCell.h有一个名为“threadTempDataLAbel”的UILabel Outlet,它将类似于 -

@interface ThreadTempDataTableViewCell : UITableViewCell

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

@end

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

enter image description here

连接后,您会看到类似 -

的内容

enter image description here

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

#import <UIKit/UIKit.h>

@interface ThreadTempDatasViewController : UIViewController<UITableViewDelegate, UITableViewDataSource>

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

@end

现在,在故事板中选择ViewController,然后像之前一样转到最后一个标签,并连接tableView的插座。

enter image description here

嗯,这应该是您需要的所有设置。现在你可以跳转到你的代码来填充表或访问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

希望这有帮助。