我正在逐步创建我的第一个iOS应用。现在,我在表视图控制器上遇到一种奇怪的行为,我无法解决,并且一直在寻找原因数小时。这是场景:
使用核心数据的简单iOS应用。
表视图控制器显示一个核心数据实体对象。
一个视图控制器(AddViewController)输入几个属性值。
一个视图控制器(EditViewController)更新对象值(在表视图控制器上选择行之后)。
为了使问题足够清楚,我只考虑所有字符串属性中的三个属性“ thingName”,“ urgent”和“ color”。每行显示一个字符串(thingName),一个图像作为color属性的图标,另一幅图像作为紧急属性的图标。
应用程序过程从空白表开始,按下“添加”按钮后,应用程序显示AddViewController视图,该视图具有文本字段(thingName),将对象标记为紧急/非紧急的开关和一组彩色的按钮为对象分配颜色依赖性。引入thingName之后,将对象选择为紧急对象或紧急对象,然后选择颜色按钮之一,用户点击保存按钮,然后点击后退按钮以返回表视图控制器。一切正常。出现一个新行,其中包含thingName文本为cell.text,该图标表示该对象被标记为紧急对象,并且使用用户从所选颜色中选择的彩色铅笔。
然后,如果用户想要更改thingName文本/紧急或非紧急/颜色,则选择对象行,应用程序将显示editViewController。如果用户更改了文本,则在保存后,更新的文本也会显示在表格视图中,这意味着应用程序已存储了更改。如果用户将紧急状态从非紧急状态更改为紧急状态,则在保存并返回到表格视图后,紧急图标会按预期显示,但是在从紧急状态更改为非紧急状态后,保存并返回到表格视图,确实出现了不应该出现的紧急图标。为了检查该问题,我在editviewcontroller上包括了一个文本字段(urgentTextField)以显示紧急属性的内容,并且它根据开关状态的变化而变化。这意味着,如果用户将开关设置为“紧急”,则紧急文本字段显示“不紧急”;如果用户将开关设置为紧急,则紧急文本字段显示“紧急”。
样品盒:
thingName = @"test";
urgentTextField.text=@"Not urgent";
在这种情况下,该行显示了预期的文本“ test”。但是该图标未按预期响应,则显示紧急图标。
为了使它更容易,这是代码:
RootViewController(表视图控制器):
- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
{
NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:indexPath];
NSString *colorValue = [[managedObject valueForKey:@"color"] description];
NSString *isUrgent = [[managedObject valueForKey:@"urgent"]description];
[[cell textLabel] setText:[[managedObject valueForKey:@"thingName"] description]];
NSString *myString = [NSString stringWithFormat:@"%@",[[managedObject valueForKey:@"todoYear"] description]];
//color pencil
if ([hasColorValue isEqual:@"Si color"]){
UIButton *colorButton = [[UIButton alloc]initWithFrame:CGRectMake(308, 5, 10, 40)];
[colorButton setImage:[UIImage imageNamed:colorValue]forState:UIControlStateNormal];
[cell addSubview:colorButton];
}
//urgent
if ([isUrgent isEqual:@"Urgent"]){
UIButton *urgentButton = [[UIButton alloc]initWithFrame:CGRectMake(71, 27, 18, 18)];
[urgentButton setImage:[UIImage imageNamed:@"urgent-3"]forState:UIControlStateNormal];
[cell addSubview:urgentButton];
}
../..
这是EditViewController的代码:
- (IBAction)SaveButtonAction:(id)sender {
AppDelegate* appDelegate = [AppDelegate sharedAppDelegate];
NSManagedObjectContext* context = appDelegate.managedObjectContext;
[selectedObject setValue:ToDoTextField.text forKey:@"thingName"];
NSString *valorUrgent = urgentTextField.text;
[selectedObject setValue:valorUrgent forKey:@"urgent"];
NSError *error;
if(! [context save:&error])
{
NSLog(@"Whoopw,couldn't save:%@", [error localizedDescription]);
}
}
- (void)viewDidLoad
{
colorImagen.image = [UIImage imageNamed:nil];
[ToDoTextField becomeFirstResponder];
//recogiendo datos de selectedobject;
ToDoTextField.text = [[selectedObject valueForKey:@"thingName"]description];
colorTextField.text = [[selectedObject valueForKey:@"color"]description];
NSString *imageName = colorTextField.text;
colorImagen.image = [UIImage imageNamed:imageName];
NSString *urgentValue = [[selectedObject valueForKey:@"urgent"]description];
urgentTextField.text = urgentValue;
if ([urgentValue isEqual:@"Urgent"]){
[urgentSwitch setOn:YES animated:YES];
urgentImage.image=[UIImage imageNamed:@"urgent-3"];
}
if ([urgentValue isEqual:@"Not urgent"]){
[urgentSwitch setOn:NO animated:YES];
urgentImage.image=[UIImage imageNamed:nil];
}
[ToDoTextField addTarget:self action:@selector(textFieldDidChange) forControlEvents:UIControlEventEditingChanged];
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
请告诉我是否需要进一步的信息或代码来检测我找不到的问题在哪里。
谢谢
最佳答案
您的问题似乎出在configureCell:
方法中。您没有考虑单元重用。您正在配置的单元可能以前需要使用过,并且之前可能处于紧急状态。
您的代码仅处理单元格紧急的情况,在这种情况下,它将添加一个子视图。这种方法有两个问题:
重用的单元格每次都会添加子视图-因此彼此之间可能有许多紧急视图。单元只能添加一次并将其保留在属性中
在紧急情况下(通常,在else
之后的if
),必须添加代码来配置单元。这将隐藏紧急图标。