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