【发布时间】:2013-12-03 21:14:57
【问题描述】:
我想从情节提要加载一个 tableViewCell,而不使用 dequeueReusableCellWithIdentifier 创建一个原型单元格以在调用 cellForRowAtIndex 之前引用。在 CellForRowAtIndex 之外调用它会做一些有趣的事情。 dequeueReusableCellWithIdentifier 仍然像往常一样在 cellForRowAtIndex 中使用。
我根据其内容动态设置单元格高度。这需要我知道 tableViewCell 中视图的大小、位置、文本属性(如字体大小、对齐方式等)在哪里。否则我必须对这些值进行硬编码以匹配情节提要中的内容。
我目前正在做的是创建一个仅包含单元格的新 xib 文件,从 viewDidLoad 加载它,并保留指向它的指针。
-(void)viewDidLoad {
// typical coding stuff goes here
// load nib
UINib *nib = [UINib nibWithNibName:@"ContentTextCell" bundle:nil];
// assign nib to identifier
[self.tableView registerNib:nib forCellReuseIdentifier:@"ContentTextCell"];
// reference cell
NSArray *topLevelObjects = [nib instantiateWithOwner:nil options:nil];
_referenceContentTextCell = [topLevelObjects objectAtIndex:0];
}
有什么方法可以让我加载表格视图单元而不使其成为自己的笔尖?使用 dequeueReusableCellWithIdentifier:forIndexPath: 会导致 tableView 行为不正确。
附加说明 我想很多人的印象是我将代码称为 cellForRowAtIndex。它在 viewDidLoad 中调用。它总是这样显示,但在略读问题时可能很容易理解。我还在 cellForRowAtIndex 中照常使用 dequeueResuableCell。只是想说明清楚。
行高是动态的。如果您提出我应该将行高设为 44 的建议,那么您可能需要在尝试回答问题之前更仔细地阅读该问题。
我使用的文本来自 json 文件,它需要 textView 的段落、字体和定位来计算文本高度,这会影响行高。我想从原型单元中提取这些数据,而不是对值进行硬编码,并确保它们与情节提要中的内容相匹配。
代码已按原样运行。它运行良好。我只是认为能够从情节提要中提取原型单元而不是为其创建新的 xib 会更方便。
【问题讨论】:
-
您不想使用这种方法。我试过了。当你最终让它工作时,它会表现不佳并且会阻塞你的主线程。当你把它放在后台线程上时,它不会工作,因为 UIKit 不喜欢在后台线程上。它真的很聪明,可惜它不起作用,但你最好将字符串大小和填充相加。
-
只是为了让我们在同一个页面上,你是说加载一个笔尖,特别是一个带有一个 tableViewCell 的笔尖会阻塞主线程?它是一个小笔尖,如果你在 textedit 中打开它它不到一页。你认为这段代码在 cellForRowAtIndex 中吗?那将是可怕的,但它只在 viewDidLoad 中。我认为它不会在任何可测量的时间内阻塞主线程。
-
我并不是说加载笔尖会有问题。我是说:如果您有一个包含大量数据的数组,并且您遍历数组中的每个项目,并将每个项目输入到您的单元格中,然后对项目进行布局以计算高度......这可能会阻塞主要线程明显。
-
我明白了,这会在很大程度上影响性能。但我不遍历数组。我直接用 indexPath 索引数据,O(1) 时间,让文本值计算 tableView:heightForRowAtIndexPath: 上的高度。感谢您的意见。
-
您不能从情节提要中拉出 UIView,但可以拉出 UIViewController。如果您更愿意使用故事板,您可以制作一个仅将单元格作为子视图的虚拟控制器,但这可能与您当前的方法一样奇怪。
标签: ios objective-c uitableview storyboard