Iphone 如何为UITableView中的每个单元格设置标识?

Iphone 如何为UITableView中的每个单元格设置标识?,iphone,uitableview,global-variables,Iphone,Uitableview,Global Variables,我有一个分组的UITable视图作为自定义设置视图。每个单元格都是一个包含3个UITextFields和一些其他UIView的视图 创建单元格时,我调用一个函数 [cell initCell:indexPath.section withRow:indexPath.row]; 然后单元知道显示哪个配置-这很好 我的问题是,当表格被滚动时,单元格失去了它的标识,导致它保存了错误的设置。 我救了 NSString*视图; NSString*行 但它总是有最后一个值,最后一个单元格的值 也许我对全局参

我有一个分组的UITable视图作为自定义设置视图。每个单元格都是一个包含3个UITextFields和一些其他UIView的视图

创建单元格时,我调用一个函数

[cell initCell:indexPath.section withRow:indexPath.row];
然后单元知道显示哪个配置-这很好

我的问题是,当表格被滚动时,单元格失去了它的标识,导致它保存了错误的设置。 我救了 NSString*视图; NSString*行

但它总是有最后一个值,最后一个单元格的值

也许我对全局参数有错误的理解,或者可能对单元重用有错误的理解。 请告知, 谢谢

My cellForRowAtIndexPath:

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

if(indexPath.section==0)
{
    static NSString *CellIdentifierDate = @"SettingsCellPickDate";

    SettingsCellPickDate *cell = (SettingsCellPickDate *)[tableView dequeueReusableCellWithIdentifier:CellIdentifierDate];
    if (cell == nil) {
        NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifierDate owner:self options:nil];

        for(id currentObject in topLevelObjects) {
            if ([currentObject isKindOfClass:[SettingsCellPickDate class]]) 
            {
                cell = (SettingsCellPickDate *) currentObject;
                break;
            }
        }
    }

    [cell initCell:indexPath.section withRow:indexPath.row];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;



    cell.frame = CGRectZero;

    return cell;
}


//tableView.rowHeight = 100;    
static NSString *CellIdentifierDate = @"SettingsCellValue";

SettingsCellValue *cell = (SettingsCellValue *)[tableView dequeueReusableCellWithIdentifier:CellIdentifierDate];
if (cell == nil) {
    NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:CellIdentifierDate owner:self options:nil];

    for(id currentObject in topLevelObjects) {
        if ([currentObject isKindOfClass:[SettingsCellValue class]]) 
        {
            cell = (SettingsCellValue *) currentObject;
            break;
        }
    }
}

[cell initCell:indexPath.section withRow:indexPath.row];
cell.selectionStyle = UITableViewCellSelectionStyleNone;

cell.frame = CGRectZero;

return cell;

}
例如,SettingsCellValue类如下所示:我更改了一些文本并删除了一些可能暗示我的应用想法的内容:

#import "SettingsCellValue.h"

@implementation SettingsCellValue
@synthesize defLabel1, defLabel2, defLabel3, defLabel4, text1, text2, text3, typeOfBar;

//@synthesize defLabel, valueField;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {
        // Initialization code
    }

    return self;
}

NSString *view;
NSString *bar;

-(void) initCell:(int)section withRow:(int)row
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
    NSInteger viewType = [defaults integerForKey:@"ScreenType"]; 

    bar = [self getBarAsText:section];
    view = [self getViewTypeAsText:viewType];

    //Update row 1
    defLabel1.text = @"Text1";
    text1.text = [defaults objectForKey:[NSString stringWithFormat:@"%@/%@/Caption", view, bar]];
    //Update row 2
    defLabel2.text = @"Text2";
    typeOfBar.selectedSegmentIndex = [defaults integerForKey:[NSString stringWithFormat:@"%@/%@/Type", view, bar]];
}

- (NSString *) getBarAsText:(int)section
{
    switch (section) {
        case 1:
            return @"Ba1r";
            break;
        case 2:
            return @"Bar2";
            break;
        case 3:
            return @"Bar3";
            break;
        default:
            return @"Ba1r";
            break;
    }
}

- (NSString *) getViewTypeAsText:(int)viewType
{
    switch (viewType) {
        case 1:
            return @"viewType1";
            break;
            case 2:
                return @"viewType2";
                break;
            case 3:
                return @"viewType3";
                break;
            case 4:
                return @"viewType4";
                break;
        default:
            return @"viewType1";
            break;
    }
}

-(IBAction) editingDidEnded:(id) sender
{
    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    if (sender == text1) {
        [defaults setObject:text1.text forKey:[NSString stringWithFormat:@"%@/%@/Caption", view, bar]];
    }


    [defaults synchronize];
}

- (void)dealloc {
    [ defLabel1, defLabel2, defLabel3, defLabel4, text1, text2, text3, typeOfBar release];
    [super dealloc];
}


@end

您不应该将某个数据对象绑定到某个单元格对象,因为这会破坏单元格重用。虽然您的代码看起来并没有完全错误,但问题的标题指向了您尚未理解的方向


我注意到一件事:您使用静态NSString*CellIdentifierDate两次。您应该重命名一个。

使用您的tableView:cellForRowAtIndexPath会很有帮助:您最好阅读MVC并仔细阅读tableView套件示例代码。你做错了,你需要重新开始,改变你的思维方式。这比我想帮你做的还多。请了解MVC是什么,它的用途是什么,以及框架是如何设计和预期使用的。此外,了解单元重用、TableView如何工作等。在我在本评论中引用的套件中有许多示例。祝你好运。initCell:withRow:看起来像什么?它是一个普通函数,用于更新单元格标签的文本。它还更新了一个局部变量,我以后使用它来更新正确的配置。但出于某种原因,该变量始终设置为创建的最后一个单元格的值。我应该意识到我的细胞再利用工作得很好。当最大单元格数可见时,我检查了editingand函数,我看到当调用该函数时,变量值被设置为(如我所说)最后创建的单元格值。即使我在另一个实例上,这意味着其他全局变量对吗?查看与该变量相关的所有内容可能会有所帮助。首先,感谢顶部我更改了变量名称,它也不应该显示日期。有人曾经说过,司令部+C,司令部+V是你最大的敌人。我的单元重用非常有效,唯一的问题是单元的全局变量设置为最后创建的单元的值。阅读我在另一个answear的评论中所写的内容。正如我所指出的,你发布的代码看起来没有错。错误在别处。我的问题是变量NSString*bar由于某种原因总是设置为最后创建/重用的单元格的值。它是使用-void initCell:intsection with row:introw设置的