ios - 从 Storyboard 加载 tableViewCell 而不使用 dequeueReusableCellWithIdentifier

标签 ios objective-c uitableview storyboard

我想从 Storyboard加载 tableViewCell,而不使用 dequeueReusableCellWithIdentifier 在调用 cellForRowAtIndex 之前创建要引用的原型(prototype)单元格。在 CellForRowAtIndex 之外调用它会产生有趣的事情。 dequeueReusableCellWithIdentifier 仍像往常一样在 cellForRowAtIndex 中使用。

我根据单元格的内容动态设置单元格高度。这需要我知道 tableViewCell 中 View 的大小、位置、文本属性(如字体大小、对齐方式等)在哪里。否则我必须对这些值进行硬编码以匹配 Storyboard中的内容。

我当前正在做的是创建一个仅包含单元格的新 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];
}

有什么方法可以让我加载表格 View 单元格而不使其拥有自己的 Nib ?使用 dequeueReusableCellWithIdentifier:forIndexPath: 会导致 tableView 行为不正确。

附加说明 我认为很多人的印象是我在 cellForRowAtIndex 上调用了代码。它在 viewDidLoad 中被调用。它总是这样显示,但也许在浏览问题时很容易理解。我仍然在 cellForRowAtIndex 中照常使用 dequeueResuableCell。只是想澄清这一点。

行高是动态的。如果您建议我应该将行高设置为 44,那么您可能需要在尝试回答问题之前更仔细地阅读问题。

我使用的文本来自json文件,它需要textView的段落、字体和位置来计算文本高度,这会影响行高。我想从原型(prototype)单元中提取这些数据,而不是对值进行硬编码,并确保它们与 Storyboard中的内容匹配。

代码已经按原样运行。它运行良好。我只是认为能够从 Storyboard中提取原型(prototype)单元而不是为其创建一个新的 xib 会更方便。

最佳答案

如果我理解正确,行高是模型和单元格中 subview 的一些属性的函数,例如模型中的字符串和单元格 TextView 中的字体大小。

我同意将单元格 subview 的 View 属性保留在代码中似乎与将它们保留在 Storyboard中是多余的,但您也认为保留引用单元格很奇怪,这是正确的。无论您是从 Nib 获取单元格还是找到从 Storyboard获取单元格的方法(我认为您做不到,这就是您所说的问题的答案),这都很奇怪。

将 heightForRowAtIndexPath 中的单元格出列没有多大意义,并且可能会导致无限递归循环,我相信您已经发现了。

所以你可能不会喜欢这个答案,但我认为最好的想法是“态度改变的冗余”。 “冗余”意味着您将 View 属性保留在代码中,就像返回 textView 所需字体 pointSize 的方法一样。 “态度改变”意味着你不认为这是多余的。相反,您的代码应该是与行高相关的所有 View 属性的权威。将 Storyboard中的原型(prototype)单元视为可视化正确编码值的一种方式。我什至建议在配置单元格时使用编码值在代码中设置属性,尤其是在属性不是太多的情况下。

最后,如果您的 rowHeight 计算很复杂,而且听起来确实如此,请务必也实现

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath

并在其中进行更快的计算(例如返回一个常量)。

关于ios - 从 Storyboard 加载 tableViewCell 而不使用 dequeueReusableCellWithIdentifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20361808/

相关文章:

ios - 自定义 uitableViewCell

iphone - 由于 glGetString 应用程序崩溃

objective-c - 避免 UIKeyboard 和自动布局

ios - 仅当成功将对象添加到nsset时,才能将对象添加到nsmutablearray吗?

ios - 如何在 swift 中以编程方式创建 UITextField 事件?

iphone - 以编程方式选择 tableview 行

iphone - Mac 在 MonoTouch 和 XCode 中开发的系统要求

objective-c - NSRunAlertPanel 和超链接

ios - 在更改 View (Segue) 时显示事件指示器并为下一个 View (API) 加载数据

ios - 如何在 iOS 上拖放多个 uitableveiwcells?