我目前正在尝试将我的iOS应用程序转换为Mac,因此我想复制iOS版本中的一些行为。在移动应用程序中,我使用关于内容和高度的动态表视图行,当我设置必须显示的数据时,我调整单元格包含的视图的框架。
例如:
我启动一个高度为100的单元格,然后,对于另一个单元格,我将自定义高度属性重置为60,更改单元格所代表的数据对象,并调整其包含的视图以使它们适合于调整高度。
然而,在Mac上,它似乎没有像预期的那样工作。细胞的初始化似乎工作正常,但一旦细胞被重复利用,一切似乎都失控了。
这是我的代码:
- (NSView *)tableView:(NSTableView *)tableView
viewForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row {
// Get an existing cell with the 'View' identifier if it exists
MyCustomTableCellView *result = [tableView makeViewWithIdentifier:@"View" owner:self];
// There is no existing cell to reuse so create a new one
if (result == nil) {
float height = [[rowHeights objectAtIndex:row] floatValue];
result = [[MyCustomTableCellView alloc] initWithFrame:NSMakeRect(0, 0, self.frame.size.width, height) height:height];
// This allows the cell to be reused.
result.identifier = @"View";
}
// result is now guaranteed to be valid, either as a reused cell
result.height = [[rowHeights objectAtIndex:row] floatValue];
result.data = [arrayToDisplay objectAtIndex:row];
// Return the result
return result;
}
和MyCustomTableCellView
的数据属性的设置者:
-(void)setData:(Data *)d{
data = d;
titleLabel.stringValue = d.titleText;
someLabel.stringValue = d.someText;
float h = self.height-kInset;
someLabel.frame = NSMakeRect(someLabel.frame.origin.x, titleLabel.frame.origin.y-h-10, self.bounds.size.width-130, h);
}
正如您所看到的,someLabel
的文本(在我的情况下)是不断变化的,我希望它适应单元格的尺寸。我可以确认发生这种情况只有当一个小区被重新使用时。
初始化结果:
+-------------------------------+
|titleLabel |
+-------------------------------+
| |
|someLabel |
| |
+-------------------------------+
重复使用结果:
+-------------------------------+
|titleLabel |
+-------------------------------+
| | <---- UNWANTED OFFSET!
+-------------------------------+
| |
|someLabel |
| |
+-------------------------------+
答案 0 :(得分:1)
好的,对于遇到同样问题的所有人:
在这段代码中设置新数据:
- (NSView *)tableView:(NSTableView *)tableView
viewForTableColumn:(NSTableColumn *)tableColumn
row:(NSInteger)row {
// Get an existing cell with the 'View' identifier if it exists
MyCustomTableCellView *result = [tableView makeViewWithIdentifier:@"View" owner:self];
float height = [[rowHeights objectAtIndex:row] floatValue];
// There is no existing cell to reuse so create a new one
if (result == nil) {
result = [[MyCustomTableCellView alloc] initWithFrame:NSMakeRect(0, 0, self.frame.size.width, height) height:height];
// This allows the cell to be reused.
result.identifier = @"View";
}
NSRect frame = result.frame;
frame.size.height = height;
result.frame = frame;
// result is now guaranteed to be valid, either as a reused cell
result.height = height;
result.data = [arrayToDisplay objectAtIndex:row];
// Return the result
return result;
}
我还必须确保更改单元格的框架高度(无论出于何种原因)。所以我基本上也将单元格的框架高度设置为动态高度。