为ce​​llForRowAtIndexPath加载/保存不同的UITableView数据的最佳方法?

时间:2011-07-19 11:42:29

标签: objective-c ios uitableview

我有一个多区域UITableView,在各行中有不同类型的控件(多选复选框,单选复选框,文本输入,文本区域等)。每行可以有不同的数据类型(字符串,整数,日期等),行数和位置是动态的,因此您不能总是依赖X部分Y作为特定控件。

我的问题是将数据输入保存到这些字段以便在视图中使用的最佳方法是什么,抓取正确的数据以显示调用cellForRowAtIndexPath时输入到该字段的内容。

请注意,我不是要求如何持久保存这些数据,我正在使用CoreData,问题是如何在与视图交互时临时保存数据,以便在NSMutableArray或NSMutableDictionary中使用它准备好在用户触摸“保存”按钮时使用CoreData保存,或者如果按“取消”则完全丢弃。

目前我正在尝试实现字典,但它看起来有点笨拙,而且我常常会在另一行显示一行的数据。

这是我当前保存表单数据的方法。它使用参数中的名称以及用作整个视图的计数器变量。计数器变量也用作控件的标记整数。

-(id)documentField:(UIView *)view withKey:(NSString *)key andValue:(id)value{

    NSInteger foundTag = -1;

    NSLog(@"searching dictionary for key: %@", key);

    for(NSString *existingKey in fieldValues){

        NSArray *keyParts = [existingKey componentsSeparatedByString:@"~"];
        if( [[keyParts objectAtIndex:0] isEqualToString:key] )
        {
            foundTag = [[keyParts objectAtIndex:1] intValue];
            NSLog(@"found key: %@, it's tag is: %d", [keyParts objectAtIndex:0], foundTag);            
            break;

        }//end if
        else{
            //NSLog(@"no match: %@ != %@", (NSString *)[keyParts objectAtIndex:0], key);
        }

    }//end for


    //if we haven't tagged this element yet
    //set the tag
    if (foundTag == -1) {
        view.tag = fieldValueCounter;
        foundTag = fieldValueCounter;
        fieldValueCounter++;
    }//end if


    NSString *fieldKey = [NSString stringWithFormat:@"%@~%d", key, foundTag];
    if( ! [fieldValues objectForKey:fieldKey] ){
        [fieldValues setObject:((value)? value : @"") forKey:fieldKey];
    }


    NSLog(@"returning fieldValue: %@ = %@", fieldKey, [fieldValues objectForKey:fieldKey]);
    return [fieldValues objectForKey:fieldKey];

}//end documentField:withKey:andValue:

以下是它的使用方法。

((UTVCellTextField *)cell).textLabel.text = @"Door Location:";
((UTVCellTextField *)cell).textField.text = [self documentField:((UTVCellTextField *)cell).textField withKey:@"door.door_location" andValue:door.door_location];
((UTVCellTextField *)cell).textField.delegate = self;

0 个答案:

没有答案