4

누구나 이해 :이 코드는 presentModalViewController를 사용하는 이유는 무엇입니까? (하지과 pushViewController)에 CoreDataBooks 예제 코드에서 그 이유를

이 가

이 항목을 클릭하고 상세한보기로 이동 컨트롤러 (가) 방법 스와핑 차이

하다니 사용 무엇에 보인다 "pushViewController"의 표준 UINavigationController 개념으로, "추가"새 레코드 단추를 클릭하면 "presentModalViewController"을 통해 레코드를 추가하는 새로운보기가 시작됩니다. 즉, 두 가지 경우 모두 pushViewController 방식을 사용하여 접근 방식을 동일하게 할 수 없었습니까?

실제로 각 방법을 사용한 위치에 이점이 있습니까? 나는 꽤 볼 수 없다. 나는 애플이 다른 시나리오를 위해이 다른 접근법을 선택해야 할 무언가가 있었음에 틀림 없다. 예를 들어

  1. 사용자에게 어떠한 차이 (즉 UI 차이 또는 기능적 차이 )들이 알 것이다?

  2. 어떤 개발자 에 대한 차이 (또는 장점/단점) 예를 들어

, 당신과 pushViewController 방식 대신에 "추가"시나리오에 대한 presentModalViewController 접근 방식을 사용하는 것을 고려한다면 .. .

(b) 데이터를 공유하는 방법의 차이

공통 데이터 객체를 공유하는 방법에 대한 접근 방식이 다른 것처럼 보입니다 - 그래서 접근 방식이 서로 다른 이유가 궁금합니다.

코드 편의에 대한

추출 - (즉, 메인 컨트롤러가 일시적으로 다른보기로 떨어져 통과하고 그들 사이에 공유 된 데이터가되어 두 경우 모두 아이 뷰는 부모에게 다시 전달하는 데 필요한 즉) "편집"을위한

:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // Create and push a detail view controller. 
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    Book *selectedBook = (Book *)[[self fetchedResultsController] objectAtIndexPath:indexPath]; 

    // Pass the selected book to the new view controller. 
    detailViewController.book = selectedBook; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    [detailViewController release]; 
} 

그러나 대한이

- (IBAction)addBook { 
    AddViewController *addViewController = [[AddViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    addViewController.delegate = self; 

    // Create a new managed object context for the new book -- set its persistent store coordinator to the same as that from the fetched results controller's context. 
    NSManagedObjectContext *addingContext = [[NSManagedObjectContext alloc] init]; 
    self.addingManagedObjectContext = addingContext; 
    [addingContext release]; 

    [addingManagedObjectContext setPersistentStoreCoordinator:[[fetchedResultsController managedObjectContext] persistentStoreCoordinator]]; 
    addViewController.book = (Book *)[NSEntityDescription insertNewObjectForEntityForName:@"Book" inManagedObjectContext:addingContext]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:addViewController]; 
     [self.navigationController presentModalViewController:navController animated:YES]; 

    [addViewController release]; 
    [navController release]; 

} 
"추가"

감사합니다.

답변

9

모달보기 컨트롤러를 사용하여 작업에 사용자의주의를 집중시킵니다. 푸시하면 사용자가 일종의 탐색 흐름에 있지만 손끝에서 총 응용 프로그램을 사용할 수 있습니다. 그들은 앞으로 또는 뒤로 가고, 중간의 다른 탭으로 전환하기로 결정할 수도 있습니다.그들은 모달 뷰 컨트롤러를 얻을 때 작업이 완료되거나 취소 될 때까지는 아무 것도 할 수 없습니다 (모달 뷰가 해제 됨)

1

[경고 :이 답변은 CoreDataBooks의 업데이트 된 코드에 더 많이 적용됩니다 , 이는 persistentStoreCoordinator를 사용하는 대신 NSManagedObjectContext의 iOS5 setParentContext 메소드를 사용하도록 변경되었습니다. [

데이터 공유에 관한 두 번째 질문은 모달 Add for Modeless Edit 접근 방식에서도 응답합니다. 시뮬레이터에서 응용 프로그램을 실행하고 그주의 사항 : 다음보기 끝난를 가지고 편집을 클릭하면 당신이 버튼을

  • 을 다음 뷰가 모두 저장 추가 및 취소를 클릭하면

    1. 을 단추.

    는 (지금이 특정 프로젝트에서 한 번에 각 필드를 편집해야하고 필드 편집은 또 다른 관점에서 수행, 그 하나 때문에, 버튼을 취소하지만, 지금은 그것을 무시있다

    예 : 제목을 편집하고 저장을 누르면 수정 완료 버튼이있는 편집보기로 되돌아갑니다. 변경 사항을 취소하기위한 취소가 없으므로 완료 만 누를 수 있습니다. 이 관점이 중요하다면 책 모드를 편집했습니다. 전혀 그렇지 않습니다.

    b. 놀라운 UI! CoreDataBook을 다음과 같은 간단한 앱으로 만들어보세요. 너의 자신의 관례. 최소한 편집을 셀에 넣으십시오.)

    우리는 어디에 있었습니까? 오, 예, "Edit"- 기존 Book은 modeLESS이므로 동일한 MOC (NSManagedObjectContext)에 원본 Book을 전달하고 Edit 뷰에서 편집을 취소 할 수 없습니다. "Add"- 책은 MODAL : 자세히보기에서 편집 할 새 책을 만들고 을 삭제하려는 경우 사용자가 취소를 누르는 경우입니다. 이를 달성하기 위해서는 첫 번째 자식 인 MOC를 사용해야합니다. 사용자가 취소하면 새 하위 MOC를 무시하고 효과적으로 새 책을 삭제합니다. 사용자가 저장하면 하위 MOC를 저장하여 새 MOC에 새 책 및 해당 속성을 밀어 넣은 다음 상위 MOC를 저장합니다.

    이 하위 MOC 접근 방식은 WWDC 2011 프리젠 테이션 303 "iOS의 핵심 데이터의 새로운 기능"에서 자세히 설명합니다. 은 전무 MOC와 새로운 관리 객체를 생성

    • 포함, SO의 다른 곳에서 논의 된 다른 방법이있다, 단지 부모 MOC에 삽입 사용자는 관리 사용하지

    • 저장 칠 때 NSDictionary 또는 다른 변수 집합과 같은 임시 객체 (다른 책)에 대한 다른 데이터 구조 (예 : NSDictionary 또는 다른 변수 집합)

    • 이상 ...? 애플을 선호하기 때문에

    나는 종류의 부모 - 자식 접근 방식을 선호하고 있습니다 때문에 데이터 모델을 사용하는 대신 임시 개체에 대한 병렬 데이터 구조를 생성하는 객체.nil-context approach는 또한 이점을 가지고 있으며, (분명히) 더 나은 성능과 단순성 (새로운 입술 읽기 : 입술을 읽음)의 부가적인 이점을 가지고 있습니다. 그러나 나는 관리 된 객체 컨텍스트가없는 관리 객체가 정결하다는 것을 확신하지 못합니다.

    그런데 CoreDataBooks는 performBlock 블록에 상위 컨텍스트를 저장하지 않기 때문에 앞서 설명한 프레젠테이션에 명시된 규칙을 정확히 따르지 않습니다.

    또한 AddViewController 속성으로 새 관리 컨텍스트를 설정하는 이유를 모르겠지만 사용하지 마십시오.

  • 관련 문제