gpt4 book ai didi

objective-c - UITableView 滞后于第一次显示包含 UITextView 的单元格

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:23:10 25 4
gpt4 key购买 nike

我遇到了 UITableView 的问题,当特定单元格将移动到 super View 时,它在滚动时滞后。

我已经编写了自己的 IPFormKit,以便通过一种简单的方法使用不同类型的 inputView 创建漂亮的输入表单,而无需为每个表单字段/单元格手动重新编码所有内容。

我有一个 UITableViewController 可以初始化我的 IPFormKit 及其字段。- (UITableViewCell *) cellForRowAtIndexPath:(NSIndexPath)indexPath; 加载出列的自定义单元格(称为 IPFormTableViewCell)并将 IPFormField 分配给每个单元格。

自定义 UITableViewCell (IPFormTableViewCell) 在初始化时使用 CGRectZero 创建所有(可能)需要的输入 View (UITextField、UITextView、CustomUILabel)。

匹配的 inputView 取决于 IPFormField 的类型(已经作为单元格的 iVar 初始化)被调整大小并作为 subview 添加到 cell.contentView 中.

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath)indexPath

对于 UITextField 和 CustomUILabel 这可以完美地工作,但是 当 inputView 是 UITextView 时,当第一次显示此单元格时,UITableView 的滚动会(稍微)明显滞后.

当单元格在滚动一段时间后再次显示时(即使单元格被重用并因此删除和重新添加 UITextView),没有延迟并且这些单元格的滚动非常流畅.

我想不出造成这种滞后的原因。任何想法表示赞赏。

PS:延迟在 iPhone 4 和 iPhone 4S 上都很明显,并且持续时间几乎完全相同(因此应该与 CPU 无关)

UITableViewController.m:

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *CellIdentifier = @"IPFormFieldCell";

// Get Form Field for indexPath
IPFormField *formField = [self.form fieldAtIndexPath:indexPath];

IPTableViewCell *cell = (IPTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
cell = [[[IPTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
cell.backgroundView = nil;
cell.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]];
cell.selectedBackgroundView = nil;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}

[cell assignFormField:formField];

return cell;
}

IPFormTableViewCell.m:

- (void)assignFormField:(IPFormField *)field:

- (void) assignFormField:(IPFormField *)field {
if (formField != nil) {
formField.inputView = nil; // unlink old field
}

self.formField = field;

// Change Field Label
[fieldLabel setText:[field label]];

// Add an Input View to the Field
UIView *labelView = nil;
UIView *inputView = nil;

switch (formField.type) {
case IPFormFieldTypeTextField:
{
labelView = fieldLabel;

UITextField *textField = inputTextField;
textField.delegate = (IPFormTextField *)formField;
textField.inputAccessoryView = [formField.form inputAccessoryView];
textField.placeholder = [self.formField stringFromValue:self.formField.defaultValue];
textField.keyboardType = [(IPFormTextField *)formField keyboardType];

if (self.formField.value == nil || [[self.formField stringFromValue:self.formField.value] isEqualToString:[self.formField stringFromValue:self.formField.defaultValue]]) {
textField.clearsOnBeginEditing = YES;
} else {
textField.text = [self.formField stringFromValue:self.formField.value];
textField.clearsOnBeginEditing = NO;
}

inputView = textField;
break;
}

case IPFormFieldTypeTextArea:
{
UITextView *textView = inputTextView;
textView.delegate = (IPFormTextArea *)formField;
textView.inputAccessoryView = [formField.form inputAccessoryView];

if (self.formField.value == nil || ![[self.formField stringFromValue:self.formField.value] length] > 0) {
textView.text = [self.formField stringFromValue:self.formField.defaultValue];
} else {
textView.text = [self.formField stringFromValue:self.formField.value];
}

inputView = textView;
break;
}

default:
break;
}

self.leftItem = labelView;
self.rightItem = inputView;

if (leftItem != nil) {
[self.contentView addSubview:leftItem];
}

if (rightItem != nil) {
[self.contentView addSubview:rightItem];
}

formField.inputView = rightItem;
}

最佳答案

显然,我的数据源的 cellForRowAtIndexPath: 使用了一个字段的属性,该属性被设置为 @property (nonatomic, copy) 而不是 @property (非原子的,只读的)

现在我已经修复了它,滚动不再滞后了。

关于objective-c - UITableView 滞后于第一次显示包含 UITextView 的单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14170341/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com