2013-01-09 1 views
0

저는 여러 개의 viewController가있는 응용 프로그램을 가지고 있는데, 각 뷰 컨트롤에는 하나의 테스트가 표시됩니다. 현재 사용자는 개별적으로 진행할 수 있습니다. 그러나 사용자가 여러 개의 테스트 또는 모든 테스트를 선택할 수있는 마법사와 비슷한 기능을 구현하려고 시도하고 있으며 응용 프로그램은 차례대로 각 테스트를 반복하여 각 화면을 사용자에게 표시하고 사용자가 입력을 제출하면, 응용 프로그램은 다음 테스트로 순차적으로 이동합니다. 모든 테스트가 완료되면 사용자가 기본 화면으로 돌아갑니다. 내가 읽은 것부터 NSNotifications가 최선의 방법 일 것입니다. 그러나 저는 솔직히 이것에 새로운 것이고 도움이 필요합니다.iOS의 NSNotifications를 통해 한 번에 하나의 viewController를 호출하려고 시도했습니다.

[[NSNotificationCenter defaultCenter] postNotificationName:@"Test" object:self]; 
:

[[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(testChange:) 
               name:@"Test" 
               object:nil]; 

가 나는 또한 각각의 ViewController 실행이 완료되면, 그것은 다음과 같은 방법으로 알림을 게시하는 것을 알고 : 나는 마법사에게 선을 시작하는 방법이 있어야 실현

내 질문에 테이블에서 사용자가 선택한 뷰 컨트롤러가 10 개 또는 20 개 있고 이러한 선택 사항이 배열에 저장되어있는 경우 addObserver 메서드와 많은 수의 postNotifications를 호출해야합니까? 내가 뭘하고 싶은건 단순히 각 viewController (사용자가 선택한대로)를 살펴보고 사용자가 해당 viewController에 대한 입력을 완료하면 해당 viewController가 메시지를 보내야하며 사용자는 다음 viewController로 이동해야합니다. 모든 검사를 마친 후 기본 화면으로 돌아갑니다. 참고로, 각 ViewController (viewDidLoad) 메서드를 호출해야합니다.

내 질문에 혼란이 있으면 사과드립니다.

+0

이것은 귀하의 질문에 대한 직접적인 대답이 아니므로 의견으로 게시하겠습니다. 나는 위임에 찬성하여 여기에서 통보의 사용을 강력히 반대한다. 부모 테이블 뷰 컨트롤러가 준수하는 일반 대리자 프로토콜을 만들고 각 자식 뷰 컨트롤러의 대리자로 할당합니다. 이런 식으로, 각 자식은 그것이 완료되면 위임자 (테이블 뷰 컨트롤러)에게이를 알릴 수 있으며, 그 시점에서이를 닫고 다음 하위 뷰 컨트롤러를 표시 할 수 있습니다. – nickbona

답변

0

당신이 모든 통지를 받기를 원한다면 당신이 가진 모든보기 컨트롤러에 대해 addObserver를 호출해야합니다. 나는 그것이 어떻게 행해지는지 보여주기 위해 작은 코드 조각을 만들었다. 나는 당신이 요구하는 모든 대답을 가지고 있다고 생각합니다. 그냥 시도해보십시오.

#import "ViewController.h" 

@interface Employee:NSObject 
@end 

@implementation Employee 
-(void)testMethod2:(NSNotification *)not{ 
    NSLog(@"Test method2 is called"); 
} 
@end 

@interface ViewController() 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (IBAction)postNotifications:(id)sender { 
    Employee *employee = [[Employee alloc] init]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(testMethod:) name:@"Notification" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(testMethod1:) name:@"Notification" object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:employee selector:@selector(testMethod2:) name:@"Notification" object:nil]; 
    [[NSNotificationCenter defaultCenter] postNotificationName:@"Notification" object:nil]; 
} 

-(void)testMethod:(NSNotification *)not{ 
    NSLog(@"Test method is called"); 
} 
-(void)testMethod1:(NSNotification *)not{ 
    NSLog(@"Test method1 is called"); 
} 
@end 
+0

정말 대단히 도움이되었으므로이 예제를 게시 해 주셔서 감사합니다! 나는 당신에게 하나의 후속 질문을 가지고있다. 즉, 내가 필요로하는 "addObserver"메소드의 수에도 불구하고, 예제에서 하나의 "postNotificationName"메소드 만 필요하다. 이 올바른지? – syedfa

+0

예. 나는 당신이 그것을 밖으로 시도해야한다고 생각합니다. 물론 같은 문제를 해결할 수있는 여러 가지 방법이 있지만 일단 시도하면 문제를 파악할 수 있습니다. – Srikanth