带有不同对象的动态uitableview



我有一个带有自定义单元格的tableView,uitextfield,uidatePicker,uipickerview。在我的方法中,我为每行的行为设置了每个行。但是我意识到,当我在顶部击中第一行时,一切都很好,而是当我向下滚动桌子并更改底部的值时,例如,我在第7行中输入的值插入了第8行,等等。下线在实践中,当我滚动表时,它会与线路索引产生混乱或例如Il uitaiteViewCellacCessoryDisclosureIndicator,而不是在重新加载表时将其分配给第9行,而是将其分配给第2行

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
    UITextField *text1 = (UITextField *)[cell viewWithTag:100];
    UILabel *text2 = (UILabel *)[cell viewWithTag:200];
    text1.text = [valuesArray objectAtIndex:indexPath.row];
    text2.text = [titlesArray objectAtIndex:indexPath.row];
    switch (indexPath.row) {
        case 0:  
            {
                text1.delegate = self;
                text1.tag = indexPath.row;
            }
            break;
        case 1: 
            {
                activityPicker = [[UIPickerView alloc] init];
                activityPicker.delegate = self;
                activityPicker.tag = indexPath.row;
                text1.delegate = self;
                text1.inputView  = activityPicker;
            }
            break;
        case 2: 
            {
                datePicker = [[UIDatePicker alloc] init];
                datePicker.datePickerMode = UIDatePickerModeDate;
                [datePicker addTarget:self action:@selector(onDatePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
                text1.delegate = self;
                text1.inputView = datePicker;
                datePicker.tag = indexPath.row;
            }
            break;
        case 3: 
            {
                datePicker = [[UIDatePicker alloc] init];
                datePicker.datePickerMode = UIDatePickerModeTime;
                [datePicker addTarget:self action:@selector(onDatePickerValueChanged:) forControlEvents:UIControlEventValueChanged];
                text1.delegate = self;
                text1.inputView = datePicker;
                datePicker.tag = indexPath.row;
                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
                [dateFormatter setDateFormat:@"HH:mm"];
                [datePicker setDate: [dateFormatter dateFromString:text1.text]];
            }
            break;
        case 4:  
            {
                activityPicker = [[UIPickerView alloc] init];
                activityPicker.delegate = self;
                activityPicker.tag = indexPath.row;
                NSString *km = [text1.text substringToIndex:[text1.text length]-3];
                int numkm = [km intValue] - 1;
                [activityPicker selectRow:numkm inComponent:0 animated:YES];
                text1.delegate = self;
                text1.inputView  = activityPicker;
            }
            break;
        case 5: 
            {
                activityPicker = [[UIPickerView alloc] init];
                activityPicker.delegate = self;
                activityPicker.tag = indexPath.row;
                text1.delegate = self;
                text1.inputView = activityPicker;
            }
            break;
        case 6: 
            {
                activityPicker = [[UIPickerView alloc] init];
                activityPicker.delegate = self;
                activityPicker.tag = indexPath.row;
                if ([text1.text isEqualToString:[animalsArray objectAtIndex:0]])
                    [activityPicker selectRow:0 inComponent:0 animated:YES];
                else
                    [activityPicker selectRow:1 inComponent:0 animated:YES];
                text1.delegate = self;
                text1.inputView = activityPicker;
            }
            break;
        case 7:  
                text1.delegate = self;
                text1.tag = indexPath.row;
            }
            break;
        case 8:  
            {
                activityPicker = [[UIPickerView alloc] init];
                activityPicker.delegate = self;
                activityPicker.tag = indexPath.row;
                if ([text1.text isEqualToString:[privacyArray objectAtIndex:0]])
                    [activityPicker selectRow:0 inComponent:0 animated:YES];
                else
                    [activityPicker selectRow:1 inComponent:0 animated:YES];
                text1.delegate = self;
                text1.inputView = activityPicker;
            }
            break;
        case 9:  
        {
            text1.enabled = NO;
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        }
            break;
        default:
            break;
    }
    return cell;
}

您的问题是使用相同的单元格标识符"Cell"对所有行。这导致您已经配置为重新加载的特定row的单元格&再次重用另一排。

假设您只有这10个单元设计,则可以做:

NSString*        identifier = [NSString stringWithFormat: @"Cell-%d", indexPath.row];
UITableViewCell* cell       = [tableView dequeueReusableCellWithIdentifier:identifier
                                                              forIndexPath:indexPath];

以这种方式,dequeueReusableCellWithIdentifier只会返回为当前indexPath创建的单元格。

最新更新