【问题标题】:UITextField in UITableViewCell - reuse issueUITableViewCell 中的 UITextField - 重用问题
【发布时间】:2015-07-21 06:55:52
【问题描述】:

我有一个UITableView,它有一个自定义UITableViewCell,里面有一个UITextField

每个UITextField 都显示来自我的viewModel 的一些文本,我正在使用Reactive-Cocoa 将文本字段绑定到viewModel

当我的UITableView 第一次加载时,一切正常。但是,当我为下一个“页面”重新加载UiTableView - 重新加载时的第一个UiTextField(第二页)tableView 与第一个“页面”中的第一个UITextField 具有完全相同的内存地址 - 单元格不是与其他 UI 元素相同是正确的 - 只是文本字段是相同的实例。

所以,我在我的 VC 中声明了 UITextFields,如下所示:

@property (weak, nonatomic)  UITextField *textFieldOne; //One the first 'page'
@property (weak, nonatomic)  UITextField *textFieldTwo; //After reload on second 'page' 

然后在cellForRowAtIndexPath调用的方法中像这样设置然后设置

 -(void)configureTextFieldCell:(BBTextFieldLabelTableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
    {
        cell.textField.delegate = self;

        if (self.selectedSegmentIndex == SegmentedControlStep1){
            if (indexPath.section == 0){

                            cell.label.text = @"Name";
                            self.textFieldOne = cell.textField;
                    }
                /* Code for setting up other cells / textfields ommited -
                but the same syntax as above with checks for indexPath */
                }

        if (self.selectedSegmentIndex == SegmentedControlStep2){

                cell.label.text = @"Username";
                self.textFieldTwo = cell.textField;

            [self bindUsernameAndPasswordToViewModel]; /* Binding for this textfield as its nil when VC loads for the first time,
                                                            so this is the first chance I get to bind it on second page */
        }
    }

BBTextFieldLabelTableViewCell 内部,UITextField 声明如下:

@property (strong, nonatomic) IBOutlet UITextField *textField;

我也尝试在单元格的实现文件中这样做:

-(void)prepareForReuse
{
    self.textField = [[UITextField alloc] init];
}

我认为我的问题可能是某种细胞重用问题。 但是,此代码没有任何区别。

所以textFieldOnetextFieldTwo 都有完全相同的内存地址,我不知道为什么。

cellForRowAtIndexPath 内部,我像这样创建单元格:

BBTextFieldLabelTableViewCell *textFieldCell = [tableView dequeueReusableCellWithIdentifier:textFieldCellidentifier];

【问题讨论】:

  • 你检查过cell的内存地址吗?
  • 有趣...地址相同,但在某些情况下,UI 元素不正确。似乎 UITableView 正在重用确切的单元格并且没有正确更新内容。知道如何解决这个问题吗?
  • 如果目的和 UI 不同,您可以为第二个屏幕制作不同的自定义单元格。
  • @AnushaK UI 是相同的,除了单元格中的 UILabel。有时标签设置不正确(与第一页上的值相同) - 似乎 UITableView 使用的是完全相同的单元格。

标签: objective-c uitableview uitextfield


【解决方案1】:

在您的 prepareForReuse 中,您正在创建一个新的文本字段,但您既没有删除旧的也没有添加新的。

我建议使用 prepareForReuse 来重置当前文本字段而不是创建一个新字段

更仔细地阅读您的问题:文本字段 1 和 2 都具有相同的值这一事实表明,在对 configureTextFieldCell 的两次调用之间没有调用准备重用。没有更多的代码,很难理解为什么

【讨论】:

  • 检查一下;正在调用 prepareForReuse。我还更改了它以重置 textField 而不是创建一个新的。但是,我仍然遇到 tableView 重用错误单元格的问题。 cellForRowAtIndexPath 只是调用 configureTextFieldCell - 没有什么特别的。我已通过创建单元格更新了我的问题。
  • @Tander tableView 的意思是重用错误的单元格。你的意思是重用单元格的旧内容没有被清除??
  • @SFF 是的,就是这样。然而,接受 Yaser 的建议似乎已经解决了一些问题,因为我不再看到这个错误。我希望我知道为什么。如果我找出导致问题的原因,将用答案更新问题。
  • @Tander 正如 Yaser 所说,除非您将旧内容从单元格中删除,否则它不会被清除。我遇到了同样的问题,并通过在重用之前删除单元格的 contentView 并在 cellForRow 中再次添加它来修复它。
  • 我能给你的最好建议是尝试了解每个细胞的生命周期。根据您的描述,似乎 textFieldOne 和 textFieldTwo 应该不同。请注意,这是您的旧代码(其中 prepareForReuse 创建了一个新文本字段)。在当前代码中,您只需清除文本字段,指针应该相同。
猜你喜欢
  • 2015-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 2013-04-29
  • 1970-01-01
  • 2011-09-19
相关资源
最近更新 更多