UITableViewCell上的UITextField停止响应触摸 - 可能是由于滚动屏幕外引起的

时间:2013-05-29 14:28:12

标签: ios uitableview uitextfield

我在动态创建的自定义UITableViewCells上有UITextFields。我正在使用它们来输入数据(如果是编辑,则从核心数据中提取数据)并在editingDidEnd上写回数据。

我的问题是我可以选择UITextFields到我的心脏内容,但如果他们滚动屏幕并再次返回,我无法触摸UITextField。

如果没有数据且textField中有数据,则会发生这种情况。当单元格重新滚动时,数据仍然存在。

有趣的是,如果我触摸textField,打开键盘,将屏幕上的单元格滚动,再向上滚动,然后按键盘上的返回键,我可以再次选择单元格。因此,当UITextfield是第一个响应者时滚动单元格似乎可以保护它免受我在这里做错的事情。

进入几行编码,我确定当触摸不触及单元格上的UITextField时,我的触摸触发了didSelectRowATIndexPath。

我正在使用故事板,我似乎正确使用了cellIdentifiers

有没有人曾经历过这种行为,并建议我应该在哪里寻找?

任何建议都会受到赞赏,因为此时我花了将近3天的时间撞到墙上试图找出最新情况

谢谢。

danypata继承了cellForRowAtIndexPath

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

{     NSString * CellIdentifier;

if (indexPath.section == dLocation){
    CellIdentifier=@"FacilityAddressCell";
}else {
    CellIdentifier=@"FacilityGPSCell";
}

DLog(@"****CellIdentifier = %@",CellIdentifier);


UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

switch (indexPath.section) {


    case dLocation:

    {

        FacilityAddressCell *theFacilityAddressCell = (FacilityAddressCell*) cell;

        theFacilityAddressCell.facilityAddressField.placeholder = self.locationFieldNames[indexPath.row];

        theFacilityAddressCell.accessoryType =UITableViewCellAccessoryNone;
        theFacilityAddressCell.selectionStyle = UITableViewCellSelectionStyleNone;

        switch (indexPath.row) {
            case facilityName:
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.name;
                break;

            case webSiteUrl:
                DLog(@"self.cur.website = '%@'",self.currentOperation.website);
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.website;
                break;

            case emailAddress:
                DLog(@"self.cur.email = '%@'",self.currentOperation.email);

                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.email;
                break;

            case country:
                DLog(@"self.cur.country = '%@'",self.currentOperation.country);
                theFacilityAddressCell.facilityAddressField.enabled = NO;
                theFacilityAddressCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.country;
                break;

            case streetName:
                DLog(@"self.cur.address = '%@'",self.currentOperation.address);
                DLog(@"streetnames initial value is '%@'",self.currentOperation.address);
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.address;
                break;

            case areaName:
                DLog(@"self.cur.address2 = '%@'",self.currentOperation.address2);
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.address2;
                break;

            case island:
                DLog(@"self.cur.address3 = '%@'",self.currentOperation.address3);
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.address3;
                break;

            case postCode:
                DLog(@"self.cur.postcode ='%@'",self.currentOperation.postcode);
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.postcode;
                break;

            case phoneNumber:
                DLog(@"self.cur.phone ='%@'",self.currentOperation.phoneNumber);
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.phoneNumber;
                break;

            case faxNumber:
                DLog(@"self.cur.fax ='%@'",self.currentOperation.faxNumber);
                theFacilityAddressCell.facilityAddressField.text = self.currentOperation.faxNumber;
                break;

            case tapToBringForward:
                theFacilityAddressCell.facilityAddressField.enabled=NO;
                theFacilityAddressCell.accessoryType =UITableViewCellAccessoryDisclosureIndicator;
                theFacilityAddressCell.facilityAddressField.text =@"Use last location details";
                break;

            default:

                break;
        }

        cell= theFacilityAddressCell;


    }
        break;

    case dGPSLoc:
    {
        DLog( @"loading the [cell data");
        GPSLocCell *theGPSLocCell = (GPSLocCell *)cell;
        theGPSLocCell.latLabel.text= [self.currentOperation.latitude stringValue];
        theGPSLocCell.longLabel.text=[self.currentOperation.longitude stringValue];
        theGPSLocCell.lockedOrNotLabel.text = @"Locked";

        cell= theGPSLocCell;

    }
        break;
}
return cell;

}

解决方案 - 问题是我正在重复使用单元格,其中一些将textfield.enabled设置为NO,并且它们将以NO作为起始值重新使用。卫生署。希望我的愚蠢能帮助别人走出困境。

经验教训 - 当您重用UITableViewCell或其子类时,它们会保留以前使用的设置,如果您对相同重用类型的某些单元格的格式不同,则最好确保在cellForIndexPath中将它们全部设置为 - 而不是只是例外:))

2 个答案:

答案 0 :(得分:2)

您的交换机中有一些地方可以设置

theFacilityAddressCell.facilityAddressField.enabled = NO;

由于单元格被重用,如果在一个地方禁用UITextField,则需要在其他情况下将其设置为启用。

尝试在indexPath.row上的交换机上方添加此行。

theFacilityAddressCell.facilityAddressField.enabled = YES;

这可以解释为什么它在开始滚动之前有效。如果你滚动一点,你的一些文本字段可能仍然有效,但如果你继续上下滚动,它们都会被禁用。

答案 1 :(得分:0)

我认为你应该检查你的tableView:cellForRowAtIndex:并确保每次调用该方法时都能正确创建UITableViewCell和它的子视图。