我的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
}
答案 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:
的原因是因为您使用该标识符将一个插入可重用单元队列。