2009-03-06 6 views
0

내 응용 프로그램에서 다음과 같이 드릴 다운 유형 인터페이스가 있습니다.
항목 목록과 "추가"버튼이있는 내 루트보기.
항목을 선택하면 navigationController에서 "Detail"보기가 푸시됩니다.
"추가"버튼을 선택하면 "추가"보기가 나타납니다.navigationController에서 서브 뷰 간 전환?

자세히보기에서 자세히보기로 전환하는 방법은 무엇입니까?

추가보기에서 일치하지 않는 "팝"을하고 디테일 컨트롤러를 켜는 것이 좋겠지 만 두 번째 부분을 애니메이션으로 만들면 디테일 뷰가 수직으로 슬라이드되거나 페이드 인됩니다. 보기를 추가 하시겠습니까?

감사합니다,
켈소

답변

0

, 당신은 몇 가지 샘플에서 애플에 의해 사용되는이 방법을 시도 할 수 있습니다

MyAddViewController.h

@protocol MyAddViewControllerDelegate; 
@class MyData; 

@interface MCCourseAddTableViewController : UITableViewController { 
@private 
    MyData *data; 
    id <MCCourseAddDelegate> delegate; 
} 

// MyData could be NSManagedObject if you want to use Core Data 
@property(nonatomic, retain) MyData *data; 
@property(nonatomic, assign) id <MyAddViewControllerDelegate> delegate; 

- (void)save; 
- (void)cancel; 
@end 

@protocol MyAddViewControllerDelegate <NSObject> 
@optional 
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data;; 
@end 

MyAddViewController.m

- (void)save { 
    if (self.delegate != nil) { 
     if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){ 
      if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){ 
       // Send data back to List View, to bring up detail view controller and dismiss add view controller 
       [self.delegate addViewController:self didAddData:self.data]; 
      } 
     } 
    } 
} 

- (void)cancel { 
    if (self.delegate != nil) { 
     if ([self.delegate conformsToProtocol:@protocol(MyAddViewControllerDelegate)]){ 
      if ([self.delegate respondsToSelector:@selector(addViewController:didAddData:)]){ 
       // Send nil back to ListView, to dismiss the add view controller only 
       [self.delegate addViewController:self didAddData:nil]; 
      } 
     } 
    } 
} 
0

당신은 세부 사항보기에 추가보기를 밀어 것을 기억하는 변수를 설정할 수 있습니다. 사용자가 Add View 팝업을 시도하면 이전 변수를 확인하고, 설정되면 루트 컨트롤러에 직접 팝업 (자동으로 Details보기가 나타남)됩니다. 마르코

0

는 현재 부가 기능은 모달를 볼 수 있는지 확인하고 거기에 "완료"(또는 "저장")과 "취소"버튼을 제공합니다. 사용자가 취소 버튼을 누르면 모달을 닫습니다. Done을 ​​누르면 테이블 모델에 새 레코드를 저장 한 다음 루트보기에서 테이블을 다시로드 한 다음 반환합니다. 멋지게하려면 새로 추가 된 항목을 플래쉬 할 수 있습니다.

이것을 설정하는 가장 좋은 방법은 모달 컨트롤러가 '완료'프로토콜 메서드를 필요로하는 대리인을 구현하고 루트 컨트롤러가이를 구현하고 대리인으로 설정되도록하는 것입니다.

이렇게하면 사용자가 '완료'를 누를 때 루트 컨트롤러에 통지되어 모든 상황을 캡슐화 할 수 있습니다. 추가 세부 뷰에서 직접 이동하려는 경우 대리자 메서드는 새로 추가 된 레코드에 대해 '밀어 넣기'를 수행 할 수 있으며 모달에서 상세 뷰로의 멋진 전환을 얻을 수 있습니다.

MyListViewController.h

#import "MyAddViewController.h" 

@interface MyListViewController : UITableViewController <MyAddViewControllerDelegate> { 
} 

- (IBAction)add:(id)sender; 
@end 

MyListViewController.m

// Action for bring up add view controller 
- (IBAction)add:(id)sender { 
    MyAddViewController *addViewController = [[MyAddViewController alloc] initWithStyle:UITableViewStyleGrouped]; 
    addViewController.delegate = self; 

    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:addViewController]; 
    [self presentModalViewController:navigationController animated:YES]; 

    [navigationController release]; 
    [addViewController release];  
} 

// MyAddViewController's delegate method, dismiss the add view controller in here 
- (void)addViewController:(MyAddViewController *)addViewController didAddData:(MyData *)data{ 
if (data) { 
    MyDetailViewController *detailViewController = [[MyDetailViewController alloc] initWithStyle:UITableViewStylePlain]; 
    detailViewController.data = data; 
    [self.navigationController pushViewController:detailViewController animated:YES]; 
    [detailViewController release]; 
} 
[self dismissModalViewControllerAnimated:YES]; 
} 
: 라민의 응답을 바탕으로