自定义UITableViewCell没有dequeueReusableCellWithIdentifier

时间:2015-12-09 16:47:39

标签: ios objective-c uitableview

所以我有一个自定义的UITableViewCell:

TestTableViewCell.h

#import <UIKit/UIKit.h>

@interface TestTableViewCell : UITableViewCell 

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

@end

TestTabelViewCell.m

#import "TestTableViewCell.h"

@implementation TestTableViewCell

-(id)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        _testCellLabel = [[UILabel alloc] init];
    }

    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@end

然后我有一个带有表视图的视图控制器,它使用自定义表视图单元格。但是这个问题是我不想在cellForRowAtIndexPath中使用dequeueReusableCellWithIdentifier。我想要有一个单元格数组。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@end

ViewController.m

#import "ViewController.h"
#import "TestTableViewCell.h"

@interface ViewController ()

@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property (strong, nonatomic) NSArray *myTableViewCells;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (NSArray *)myTableViewCells {
    TestTableViewCell *cell1 = [[TestTableViewCell alloc] init];
    cell1.testCellLabel.text = @"one";
    cell1.backgroundColor = [UIColor blueColor];

    TestTableViewCell *cell2 = [[TestTableViewCell alloc] init];
    cell2.testCellLabel.text = @"two";
    cell1.backgroundColor = [UIColor greenColor];

    if (!_myTableViewCells) {
        _myTableViewCells = @[cell1, cell2];
    }

    return _myTableViewCells;
}

#pragma mark - UITableView delegate functions

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.myTableViewCells.count;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    TestTableViewCell *cell = self.myTableViewCells[indexPath.row];
    return cell;
}

@end

问题是表格视图单元格中没有testCellLabel出现。我知道细胞在那里,因为我设置了它们的背景颜色。

与少数人交谈后,显然我需要从XIB或NIB进行某种加载才能正确加载UI?即使标签是在故事板的单元格中定义的。

我知道这违反常规,Apple真的希望你使用dequeueReusableCellWithIdentifier,但我知道它在我需要它的情况下不会工作。我已经完成了那么多的阅读 不要告诉我使用它。这个代码示例只是非常基础,例如清单和易用性。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

 TestTableViewCell *cell1 = [[TestTableViewCell alloc] init];

创建一个新的TestTableViewCell对象,并且不会像你认为的那样从故事板中实例化它。因此,所有创建的商店都将是零,并且根本不会显示。您可以设置背景颜色的事实并不表明您的实现有效。

需要才能使用dequeueReusableCellWithIdentifier。你说它对你的问题不起作用..告诉我它是如何工作的,我会告诉你为什么你错了。

修改

我在你的评论中看到你说你的手机需要一个自定义的设定器。好吧,当你使用dequeueReusableCellWithIdentifier时,你可以在awakeFromNib(如果使用xib文件)或initWithCoder进行所有设置工作,如果你正在使用故事板。

答案 1 :(得分:0)

您可以创建没有dequeueResableCellWithIdentifer的单元格。

[[UITableViewCell alloc]initWithStyle:<#UITableCellStyle#> resueIdentifier:<#(nullable *NSString)#>]