使用UITableViewCells的iOS中的错误?

时间:2015-02-27 14:15:16

标签: ios uitableview

我的iOS项目中的Storyboard中有一个UITableViewController。我有一个特殊的TableViewCell MessageCell,其中UIView位于特定类中。

当我致电tableView.dequeueReusableCellWithIdentifier:时,我只获得了UITableViewCell这个子视图树:

<UITableViewCell: 0x16da5e90; frame = (0 0; 0 0); layer = <CALayer: 0x16da5120>>
    <UITableViewCellContentView: 0x16da6210; frame = (0 0; 0 0); clipsToBounds = YES; opaque = NO; gestureRecognizers = <NSArray: 0x16da5510>; layer = <CALayer: 0x16da6280>>
    <_UITableViewCellSeparatorView: 0x16da62b0; frame = (0 -1; 15 1); layer = <CALayer: 0x16da52d0>>

但是当我打电话给tableView.dequeueReusableCellWithIdentifier:forIndexPath时,我会得到这个子视图树:

<UITableViewCell: 0x146f3a90; frame = (0 148.93; 320 54.93); autoresize = W; layer = <CALayer: 0x146f2ff0>>
    <UITableViewCellContentView: 0x146f3020; frame = (0 0; 320 54.43); opaque = NO; gestureRecognizers = <NSArray: 0x146f3e90>; layer = <CALayer: 0x146f3180>>
        <Heaven_Help.MessageView: 0x146f3f70; frame = (0 0; 320 568); autoresize = W+H; tag = 99; layer = <CALayer: 0x146f4af0>>
            <UIImageView: 0x146f4010; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <CALayer: 0x146f4090>>
            <UILabel: 0x146f40c0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x146f4180>>
            <UILabel: 0x146f42d0; frame = (0 0; 0 0); userInteractionEnabled = NO; layer = <_UILabelLayer: 0x146f4390>>
    <_UITableViewCellSeparatorView: 0x146f31b0; frame = (0 -1; 15 1); layer = <CALayer: 0x146f3c20>>
    <_UITableViewCellSeparatorView: 0x146f5170; frame = (0 -0.5; 16 0.5); layer = <CALayer: 0x146c1f40>>

我的UIImageview初始值设定项中添加了UILabels和2 MessageView

谁能告诉我我没有得到什么?

根据要求:我的代码来自tableView:cellForRowAtIndexPath:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("MessageCell", forIndexPath: indexPath) as UITableViewCell
    (cell.viewWithTag(99) as MessageView).setMessage(conversation[indexPath.row])
    return cell
}

1 个答案:

答案 0 :(得分:1)

简而言之,请勿使用dequeueReusableCellWithIdentifier:

dequeueReusableCellWithIdentifier:返回:

  

具有关联标识符的UITableViewCell对象,如果可重用单元队列中不存在此类对象,则为nil

此方法通常在没有故事板的情况下以这种模式使用:

MessageCell *cell = [tableView dequeueReusableCellWithIdentifier:@"messageCell"];

if (!cell) {
    cell = [[MessageCell alloc] initWithStyle:…reuseIdentifier:@"messageCell"];
    // set properties that are true for EVERY cell
}

// set properties from your data model for THIS cell (usually strings and images)

return cell;

(使用故事板,该方法将始终返回一个单元格。)

新方法(如dequeueReusableCellWithIdentifier:forIndexPath:)保证返回一个单元格,因此您不再需要使用此模式。

您从UITableViewCell返回dequeueReusableCellWithIdentifier:的原因是因为您使用该标识符将一个插入可重用单元队列。