dequeueReusableCellWithIdentifier不返回我的自定义类型的单元格

时间:2012-03-06 03:19:18

标签: iphone ios5 uitableview storyboard

我正在使用带有UITableViewController和UITableViewCell子类的ios5故事板。我不想在视图的storyboard设计器中设计单元格的可视元素,因为我想使用UITableViewCell的可重用子类(特别是TDBadgedCell)。

我已经在storyboard设计器中设置了我的单元格标识符,只要我没有设置TDBadgedCell独有的任何属性,所有行都在UITableView中正确加载。如果我设置badgeString属性虽然对于TDBadgedCell是唯一的,但我得到一个例外。我缩小了dequeueReusableCellWithIdentifier:没有返回TDBadgedCell类型的单元格。

我只是使用UITableViewController进行此操作。我有一个UIViewController与嵌入式UITableView以相同的方式设置,这不是一个问题。有什么想法吗?

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath*)indexPath
{
static NSString *CellIdentifier = @"PhoneNumberCell";
TDBadgedCell *cell = (TDBadgedCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    cell = [[TDBadgedCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

if ([cell isKindOfClass:[TDBadgedCell class]])
{
    NSLog(@"It is TDBadgedCell");
}
else
    NSLog(@"It is NOT TDBadgedCell");

3 个答案:

答案 0 :(得分:0)

我有类似的问题,因为我是UITableViewCell的子类,但没有使用storyboard。以下是我使用不同单元类的解决方案,具体取决于用户是否购买了应用程序的解锁功能。希望它可以帮到某人。

简而言之,我的单元格包含多个对象,包括UITextView对象。我想在Lite版本中锁定UITextView对象的复制和粘贴功能,但是一旦用户在应用内商品中购买,就会发布该功能。

我有两个UITableViewCell类,一个是UITextView,另一个是UITextView子类,canBecomeFirstresponder返回NO。这样,用户仍然可以向上和向下滚动UITextview数据,但不能复制和粘贴数据。

以下是代码,我所要做的就是重命名重用标识符。

为什么?因为[self.tableview reloadData]不会重建具有新类的单元格,因为单元格仍然存在。离开屏幕的新单元将获得新类,但现有单元不会。此解决方案在购买解锁添加的功能后,一次性重建所有单元格。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{


if (your test if in-app was purchased is yes)
{
static NSString *MyIdentifier = @"MyCell";

FrontCell *cell = (FrontCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];

if (cell == nil)
        {
        cell = [[FrontCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.shouldIndentWhileEditing = NO;
    }

//....///     

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row];
cell.trackDetails.delegate = self;
cell.trackDetails.tag = indexPath.row;


return cell;
}
else // inapp not purchased
{
    static NSString *MyLockedIdentifier = @"MyLockedCell";

    FrontCellLocked *cell = (FrontCellLocked *)[tableView dequeueReusableCellWithIdentifier:MyLockedIdentifier];

    if (cell == nil)
    {
        cell = [[FrontCellLocked alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyLockedIdentifier];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
        cell.shouldIndentWhileEditing = NO;
    }

     //....///     

cell.trackDetails.text = [yourObject objectAtIndex:indexPath.row];
cell.trackDetails.delegate = self;
cell.trackDetails.tag = indexPath.row;


return cell;    }
}

答案 1 :(得分:0)

在storyboard中,您可以为UITableviewCell的子类设置Custom Class属性。 然后dequeueReusableCellWithIdentifier方法将返回具有子类类型的单元格。

答案 2 :(得分:0)

我认为你使用错误的方法将细胞出列。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [self.tblProfileInfo dequeueReusableCellWithIdentifier:@"PostCell" forIndexPath:indexPath];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    return cell;

}

你最后忘记了indexPath。