无法将参数传递给UITableViewCell

时间:2016-01-27 15:46:43

标签: ios objective-c uitableview

我的单元格略有不同,为此我需要将参数从我的UIViewController传递到我的UITableViewCell的子类。但它不起作用。场景如下:

MessagesViewController.m:

#import "MessagesViewController.h"
#import "MessageTableViewCell.h"

- (void)viewDidLoad
{    
    [super viewDidLoad];

    [self.tableView registerClass:[MessageTableViewCell class] forCellReuseIdentifier:MessengerCellIdentifier];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MessageTableViewCell *cell = (MessageTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:MessengerCellIdentifier];

    if (cell == nil) {
        cell = [[MessageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MessengerCellIdentifier customParam:YES];
    }
    return cell;
}

MessageTableViewCell.m:

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier customParam:(BOOL)customParam
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
       // **** GET Custom Parameter (customParam) HERE ??? ****/
    }
    return self;
}

在这种情况下,customParam是我的参数。一切似乎都没问题,但是细胞不是零,所以程序失败了。

2 个答案:

答案 0 :(得分:5)

选项1:删除dequeueReusableCellWithIdentifier行,以便每次都创建一个新的自定义单元格。否则,您使用的是预先存在的单元格,该单元格已将前一个customParameter设置为显示的最后一个单元格所设置的内容。

- 注意选项1(添加为解释为什么它非常非常非常非常错误的想法(@Duncan C)。由于您使用{{1}设置单元格在创建你的单元格时,一旦它们滚动到屏幕外,iOS就会为你保留它们,以便你可以在你的代码要求时重复使用它们。但是你的代码永远不会要求可重复使用的单元格,因为它每次都会创建一个全新的单元格请求下一个单元格。这会导致高加载时间(每次创建一个新单元格)和高内存使用(因为操作系统正在保存单元格供您以后使用而不是立即解除分配)。可重用性是为原因,所以不要使用选项1,除非你有非常具体的需要(即便如此,你可能错了,不要这样做)。

选项2:将自定义参数更改为单独的方法调用。而不是在初始化程序中创建一个新方法,清除单元格并按照新自定义参数的方式重建它。然后,您可以使用新的ReuseIdentifier方法重新使用单元格并修改其外观。

编辑:选项2的代码示例,尽可能简单:

在表格控制器中

setCustomParameter:

在你的手机单元.m

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MessageTableViewCell *cell = (MessageTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:MessengerCellIdentifier];

    if (cell == nil) {
        cell = [[MessageTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MessengerCellIdentifier];
    }
    [cell setCustomParam:customParam];
    return cell;
}

答案 1 :(得分:0)

然后你必须尝试另一种方法在MessageTableViewCell中添加参数。该参数为nil,因为每次重用行中的表格视图单元格时单元格都不是

MessageTableViewCell * cell =(MessageTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:MessengerCellIdentifier];

你必须调用另一种方法,比如

MessageTableViewCell *cell = (MessageTableViewCell *)[self.tableView dequeueReusableCellWithIdentifier:MessengerCellIdentifier];

if (customParam)
{
// IF custom parameter is your labal
cell.yourCustomParameter.text = @"Add your content here"

}