2015-06-17 6 views
1

Моя реальная проблема в том, что я хочу передать данные от childViewController к parentViewController в раскадровке modal segue.Передавать данные в модальном сегменте в раскадровке?

Код

parentViewController.h

@property (strong, nonatomic)NSMutableArray *address; 

childViewController.m

parentViewController *parent=(parentViewController *)self.presentingViewController; 
[email protected]"Hello World"; 

Этот код броска исключение как

Согласующего приложение из-за неперехваченное исключением 'NSInvalidArgumentException', причину: '- [MainTabbarViewController setAddress]: непризнанный селектор направлен например 0x7fa070e6b910'

раскадровка структура

TabbarController -> NavigationController-> parentViewController-> childViewController

Спасибо вам, Advance.

+0

@Devashi ... Я думаю, делегат это лучший выбор .... 'nsuserdefault' ... аааа ... я не думаю, что так .... –

ответ

0

Там нет никакого способа, чтобы получить ссылку на Segue, который создал вас. Вы можете создать свойство (sourceVC в моем примере) в целевом контроллере и присвоить его этому свойству в методе prepareForSegue (в контроллере представления источника):

[(ChildViewController *) segue.destinationViewController sourceVC] = self ;

В любом случае, я думаю, что это лучшее решение для использования делегата.

* В ChildViewController.h *

@protocol ChildDelegate <NSObject> 
- (void)postAddress:(NSString*)ad; 
@end 

@interface ChildViewController : UIViewController 
@property (weak, nonatomic) id <ChildDelegate> delegate; 
@end 

* В ParentViewController.h *

@interface ParentViewController : UIViewController <ChildDelegate> 
@end 

* В ParentViewController.m *

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
     ChildViewController *vc = [segue destinationViewController]; 
     vc.delegate = self; 
} 

* В ChildViewController.м *

- (void)changeAddress:(NSString*)ad 
{ 
    if ([self.delegate respondsToSelector:@selector(postAddress:)]) 
    { 
     // Tell the delegate something. 
     [self.delegate postAddress:@"New Address"]; 
    } 
} 
+0

Я думаю, что это длинный код. Передавать данные с помощью nsuserdefault лучше, чем это. Что вы говорите? –

+0

Я считаю, что это действительно плохая практика, но вам решать, как использовать NSUserDefaults. – agy

1

Вы не можете передать данные обратно в родительский контроллер представления, как это. Делегирование - лучший способ реализовать это. Пожалуйста, посмотрите на следующую ссылку, где подробно объяснено.

passing-data-between-view-controllers

+0

Я думаю, что это длинный код. Передавать данные с помощью nsuserdefault лучше, чем это. Что вы говорите? –

2

правильный способ сделать это с помощью делегата

в ChildViewController.h

@protocol ChildDelegate 
- (void)postAddress:(NSString *)address; 
@end 
@interface ChildViewController 
@property (nonAtomic, assign) id<ChildDelegate> delegate; 
@end 

в ChildViewController.m

[self.delegate postAddress:address]; 

в ParentViewController.h

@interface ParentViewController <ChildDelegate> 
@end 

в ParentViewController.m

// presenting childViewController 
- (void)presentChildViewController { 
    ChildViewController *childViewController = [[ChildViewController alloc]init]; 
    childViewController.delegate = self; 
    [self presentViewController:childViewController animated:YES completion:nil]; 
} 


// delegate method 
- (void)postAddress:(NSString *)address{ 
    // add you code here 
} 
+0

Я думаю, что это длинный код. Передавать данные с помощью nsuserdefault лучше, чем это. Что вы говорите? –