2013-05-03 4 views
2

У меня есть два контроллера вида. MainViewController запускает SignUp ViewController. Как только контроллер SignUp View отклоняется, мне нужен доступ к тому же экземпляру MainViewController для обновления UIButton.title.iOS: Доступ к тому же экземпляру UIViewController, который называется Segue

.h MainView

//MainViewController.h 
#import <UIKit/UIKit.h> 


@interface MainViewController : UITableViewController 
-(void)loggedIn; 

@end 

.m

@interface MainViewController() 

@end  

-(void)loggedIn 
{ 
    NSLog (@"This is Logged in inside MainView.m"); 
    self.logInOutButton.title = @"Logout"; 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    UIViewController *destinationViewController = segue.destinationViewController; 
    Signup *signUp = [destinationViewController isKindOfClass:[SignUp class]] ? (Signup*)destinationViewController : nil; 
    signUp.mainViewController = self; 
    NSLog(@"Preapre For Segue %@", self); 
} 

.h SignUp

#import <UIKit/UIKit.h> 
#import "MainViewController.h" 
@interface SignUp : UIViewController 
@property (strong, nonatomic) MainViewController *mainViewController; 
@end 

.m

@synthesize mainViewController; 

- (void) loggedIn 
{ 
    NSLog(@" MainViewController %@", mainViewController); 
    [mainViewController loggedIn]; 
    self.presentingViewController dismissViewControllerAnimated:YES completion:nil]; 
} 

Когда я делаю NSLog Я получаю разные значения:

Preapre For Seg <STMainViewController: 0x9f7d600> 
MainViewController (null) 
+1

Вы пробовали войти что SIGNUP View Controller после того как вы назначить mainViewController? Похоже, что между ними может быть промежуточный контроллер, скорее всего, контроллер навигации ... –

+1

Проверьте, не является ли 'signUp'' nil' перед установкой свойства mainViewController. –

+1

См. Обсуждение протоколов делегатов в разделе «Передача данных назад» в http://stackoverflow.com/a/9736559/1271826 – Rob

ответ

1

Создайте протокол/делегат. Существует множество ресурсов по достижению этого. Таким образом, вы создаете протокол на целевом viewController с помощью метода, который вы хотите запустить на источнике, а затем подписываетесь на этот делегат из исходного viewController.

Protocol Delegate

Не забудьте установить делегат из метода prepareForSegue

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    Signup *signUp = segue.destinationViewController; 
    signup.delegate = self; 
    NSLog(@"Preapre For Segue %@", self); 

}

Смежные вопросы