使用textfield重用单元格

时间:2014-12-04 15:04:47

标签: ios uitableview uitextfield uicollectionviewcell

我有一个内置UITextfield的自定义单元格。 该细胞对不同类型的模型具有不同的行为。 例如,我可以使用一个模型来显示一个或多个来表示日期。

如果是数字,它只能引入数字,如果是用户开始在文本字段上输入的日期,则会看到一个uipicker选择日期。

在方法cellForRow中,我将textfield的委托设置为模型,以实现单元格的每个行为。

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    //Get Element
    SuperElement * elem = [self.arrayFields objectAtIndex:indexPath.row];
    //Get Cell of the element
    SuperCell *cell = (SuperCell*)[elem returnCellForCollectionView:collectionView andIndexPath:indexPath];

    return cell;
}

DateElement

-(UICollectionViewCell*)returnCelForCollectionView:(UICollectionView*)collectionView andIndexPath:(NSIndexPath*)indexPath{

    SuperCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[SuperCell reuseIdentifier]
                                                                    forIndexPath:indexPath];
    cell.textField.text = self.value;
    cell.textField.delegate =self;

return cell; }

-(BOOL)textFieldShouldBeginEditing:(UITextField *)textField{
    //code to show picker
}

NumberElement

-(UICollectionViewCell*)returnCelForCollectionView:(UICollectionView*)collectionView andIndexPath:(NSIndexPath*)indexPath{

        SuperCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[SuperCell reuseIdentifier]
                                                                        forIndexPath:indexPath];
        cell.textField.text = self.value;
        cell.textField.delegate =self;

    return cell;
}
  - (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
{
   //reg to accept only numbers
}

我的问题是当表重新加载时,例如当用户开始编辑文本字段时,日期选择器出现在多个模型中。 在我的自定义单元格中,我尝试清理它何时会被重用,但没有效果

-(void)prepareForReuse{

    [super prepareForReuse];
    [self.textField resignFirstResponder];
    self.textField.delegate = nil;

 }

有什么想法吗? 提前致谢

修改

如果我在prepareForReuse'方法中将textfield的inputView设置为nil

self.textField.inputView = nil;

选择器没有出现。但是我在datePicker中添加了一个“完成”按钮,该按钮仍然出现。

编辑2

要删除完成按钮,只需清理textField的inputAcessoryView即可     self.textField.inputAcessoryView = nil;

enter image description here

2 个答案:

答案 0 :(得分:1)

您应该使用texfields属性inputView来设置输入模式。当您将委托设置为nil时,此属性保持不变,您想要摆脱的行为也是如此。

文档说明:

  

如果此属性中的值为nil,则文本字段在成为第一响应者时显示标准系统键盘。为此属性分配自定义视图会导致显示该视图。

     

此属性的默认值为nil。

实施例: 的 DateElement

-(UICollectionViewCell*)returnCelForCollectionView:(UICollectionView*)collectionView andIndexPath:(NSIndexPath*)indexPath {
    SuperCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[SuperCell reuseIdentifier]
                                                                    forIndexPath:indexPath];
    cell.textField.text = self.value;
    cell.textField.delegate =self;
    UIDatePicker *datePicker = [[UIDatePicker alloc] init];
    datePicker.datePickerMode = UIDatePickerModeDate;
    cell.textField.inputView = datePicker;

return cell; }

答案 1 :(得分:0)

试试这个:

- (UITextField *) textField {

     if (!_textField) {

          _textField = [[UITextField alloc] init.....];
          // Basically customize your textfield here
     }

     return _textField;
}


-(void)prepareForReuse {

    [super prepareForReuse];

    [self.textField resignFirstResponder];

    [self.textField removeFromSuperView];
    self.textField = nil;
}