0

UIButtonsServicesViewController이 있습니다. 사용자는 버튼을 탭할 수 있으며 UIAlertViewUIAlertViewStylePlainTextInput을 통해 '추가 세부 정보'를 입력 할 수 있습니다. 사용자가 "추가 세부 정보"를 추가하지 않기로 선택하면 UIButton 상태는 selected으로 유지되고 key은 에 Yes으로 저장됩니다. "추가 세부 정보"를 추가하기로 선택한 경우 key은 여전히 ​​Yes으로 저장되고 "추가 정보"keystring으로 저장됩니다.managedObjectContext의 단일 속성이 * not * nil인지 확인하십시오.

그런 다음 사용자는 다른 ViewController으로 이동 한 다음 ServicesViewController으로 돌아갈 수 있습니다. ServicesViewControllerviewDidLoad 메소드에서 keysmanagedObjectContext에 대한 점검을 수행해야합니다. UIButtonkey이 "예"로 저장되면 UIButton 상태를 강조 표시해야합니다. "추가 세부 정보"keynil이 아닌 경우 단추는 상태를 disabled으로 변경해야하며 사용자 피드백을 위해 색을 변경할 수도 있습니다.

코드 버튼을 선택합니다 :

- (IBAction)asbBtnPressed:(UIButton *)sender { 
    if ([sender isSelected]) { 
     [sender setSelected:NO]; 
     [_managedObjectNGLS setValue:@"" forKey:@"asb"]; 
    } else { 
     [sender setSelected:YES]; 
     [_managedObjectNGLS setValue:@"Yes" forKey:@"asb"]; 
    } 

    UIAlertView *qConfirm = [[UIAlertView alloc]initWithTitle:@"Additional Information" 
                 message:@"Would you like to give additional information?" 
                 delegate:self 
              cancelButtonTitle:@"Cancel" 
              otherButtonTitles:@"Proceed", nil]; 
    qConfirm.alertViewStyle = UIAlertViewStylePlainTextInput; 
    qConfirm.tag = 2; 
    if (sender.isSelected == YES) { 
     [qConfirm show]; 
    } 
} 

사용자가 버튼 색 변경을 사용하지 않도록 설정, "추가 정보"를 입력하면

:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    // ASB 
    if (alertView.tag == 2) { 
     if (buttonIndex == 1) { 
      NSString *asbDetails = [alertView textFieldAtIndex:0].text; 
      [_managedObjectNGLS setValue:asbDetails forKeyPath:@"asbDetails"]; 
      if (asbDetails.length > 1) { 
       [_asbBtn setSelected:NO]; 
       _asbBtn.backgroundColor = [UIColor colorWithRed:(55/255.0) green:(200/255.0) blue:(0/255.0) alpha:1]; 
       _asbBtn.enabled = FALSE; 
      } 
     } 
    } 

코드 nil 값을 확인하려고 :

// If UIButton has been selected 
if ([[_managedObjectNGLS valueForKey:@"asb"] isEqual: @"Yes"]) { 
    _asbBtn.selected = YES; 

    // If "Further Details" is empty 
} else if ([_managedObjectNGLS valueForKey:@"asbDetails"] == nil) { 
    // Do nothing 
} else { 
    // Else "Further Details" must be populated, so change colour & disable button 
    _asbBtn.backgroundColor = [UIColor colorWithRed:(55/255.0) green:(200/255.0) blue:(0/255.0) alpha:1]; 
    _asbBtn.enabled = FALSE; 
    NSLog(@"asbDetails not empty"); 
} 

저는 이것이 최선의 방법이 아니라는 것을 알고 있습니다 (주로 작동하지 않기 때문에 주로!), 이상적으로 key!= 테스트를 수행하여 nil이 아닌지 확인하고 싶습니다.하지만이 방법은 작동하지 않습니다. 내가 많은 버튼과 테스트 할 많은 키를 가지고 있기 때문에 fetchRequest의 길을 가고 싶지 않았다. 그리고 각 버튼은 분리되어 있어야한다. 그래서 나는 모든 버튼을 바꾸는 것처럼 for loop을 사용할 수 있다고 생각하지 않는다? 틀 렸으면 고쳐줘. 미리 감사드립니다!

+0

당신은 이것에 흥미가 있을지 모른다 : http://stackoverflow.com/questions/25893279/check-for-multiple-nil-values-in-core-data-managedobject – Larme

+0

그것은 실제로 내가 게시 한 또 다른 질문이다. 여러 개의 'nil'값을 검사하고 있었으므로 이제는 하나의 NOT'nil' 값을 확인해야합니다 (오보 된 것처럼 제목을 업데이트했습니다). 도움이 되듯이'Key-Value coding '을 다시 한 번 살펴볼 것입니다. 그러나 누군가이 코드를 기반으로 좋은 해결책을 알고 있는지를 알기 위해이 질문을 떠날 것입니다. 그래도 고마워! – rosshump

답변

0

몇 가지 조사를 한 후에 해결 방법을 찾아야했습니다. 거기에 더 나은 솔루션은 아마도,하지만 지금은 작동합니다

- (void)isInterested { 
    // If valueForKey is "yes", keep button in selected state 
    // If ...Details key isn't empty, disable button & change colour 

    // ASB 
    if ([[_managedObjectNGLS valueForKey:@"asb"] isEqual: @"Yes"]) { 
     _asbBtn.selected = YES; 
    } 
    NSString *asbDetails = [_managedObjectNGLS valueForKey:@"asbDetails"]; 
    if (asbDetails.length > 0) { 
     _asbBtn.selected = NO; 
     _asbBtn.backgroundColor = [UIColor colorWithRed:(55/255.0) green:(200/255.0) blue:(0/255.0) alpha:1]; 
     _asbBtn.enabled = FALSE; 
     // NSLog(@"asbDetails is not empty"); 
    } 

    // More buttons 
} 

내가있는 isInterested 메소드를 호출하고 내 ServicesViewControllerviewDidLoad -이이 view로드 할 때마다의 isInterested 방법은 필요한 검사를 수행하는 것을 의미합니다 UIButton을 올바른 상태로 설정하십시오.