단계별로 첫 번째 iOS 앱 만들기를 진행하고 있습니다. 이제 나는 해결할 수없는 테이블 뷰 컨트롤러에서 이상한 동작을 경험하고 있으며 몇 시간 동안 그 이유를 찾고 있습니다. 이것은 시나리오입니다.
질문을 충분히 명확히하기 위해 모든 문자열 속성 인 'thingName', 'urgent'및 'color'속성 중 세 가지만 고려할 것입니다. 모든 행에는 문자열 (thingName), 색상 속성의 아이콘으로 이미지, 긴급 속성의 아이콘으로 다른 이미지가 표시됩니다. 앱 프로세스는 빈 테이블로 시작됩니다. 추가 버튼을 누른 후 앱은 텍스트 필드 (thingName)가있는보기 인 AddViewController보기, 개체를 긴급 / 긴급하지 않음으로 표시하는 스위치 및 컬러 그룹을 표시합니다. 단추를 사용하여 개체에 색상 종속성을 할당합니다. thingName을 소개하고 개체를 긴급하거나 긴급하지 않은 것으로 선택하고 색상 버튼 중 하나를 선택한 후 사용자는 저장 버튼을 탭한 다음 뒤로 버튼을 눌러 테이블보기 컨트롤러로 돌아갑니다. 모든 것이 예상대로 작동합니다. thingName 텍스트를 cell.text로 포함하는 새 행이 표시되고, 개체가 긴급으로 표시되었음을 나타내는 아이콘 및 사용자가 선택한 색상의 색연필이 나타납니다. 그런 다음 사용자가 thingName 텍스트 / 긴급 또는 긴급하지 않음 / 색상을 변경하려는 경우 개체 행을 선택하면 앱에 editViewController가 표시됩니다. 사용자가 텍스트를 변경하고 저장 한 후 업데이트 된 텍스트도 테이블보기에 표시되며 이는 앱이 변경 사항을 저장했음을 의미합니다. 사용자가 저장 후 테이블보기로 돌아간 후 긴급 상태를 긴급하지 않음에서 긴급으로 변경하면 긴급 아이콘이 예상대로 표시되지만 긴급에서 긴급하지 않음으로 변경 한 후 저장하고 테이블보기로 돌아 가면 나타나지 않아야하는 긴급 아이콘이 나타납니다. 문제를 확인하기 위해 editviewcontroller에 텍스트 필드 (urgentTextField)를 포함하여 긴급 속성의 내용을 표시했으며 스위치 상태에서 응답으로 잘 변경됩니다. 즉, 사용자가 스위치를 긴급 없음으로 설정하면 urgentTextField에 'Not urgent'가 표시되고, 사용자가 스위치를 긴급으로 설정하면 urgentTextField에 'Urgent'가 표시됩니다. 샘플 케이스 :
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
). 이것은 긴급 아이콘을 숨 깁니다.이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다