2013-06-20 2 views
2

В UINavigationController это контроллер ребенкаНужна помощь в отношении передачи данных от ребенка к родителю в UINavigationController

.h 

@protocol childProtocol <NSObject> 

-(void)childMethod:(NSArray*)params; 

@end 

@property (strong, nonatomic) id<childProtocol>childDelegate; 

@property (weak, nonatomic) parentVC *pVC; 

.m 

if([self.childDelegate respondsToSelector:@selector(childMethod:)]) { 

    [self.childDelegate performSelector:@selector(childMethod:) withObject:self.arry];  

} 

Это мой родительский контроллер

.m 

-(void)childMethod:(NSArray *)params { 
    // some work 
} 

... 

childVC *cVC = [[childVC alloc]init]; 
    cVC.pVC = self; 

Но childMethod: не получив вызов, поэтому я обыскал в Интернете и получил этот пост UINavigationControllers: How to pass value to higher (parent?) controller in stack?

Я попытался создать слабую ссылку, но не знаю, как использовать делегат для передачи данных от дочернего к родительскому?

+0

Покажите нам, как вы назначили делегата на ваш родительский VI ew контроллер. – Zen

+0

@ Zen ParentViewController

+0

Я имел в виду, как свойство pVC соответствует 'childDelegate'. то есть, если есть что-то вроде 'self.childDelegate = self.pVC;' или что-то подобное, сообщающее 'pVC', что он должен действовать, когда« childDelegate »отменяется? – Zen

ответ

4

Попробуйте это. Проверьте проект образец прилагается

ParentViewController.h

#import <UIKit/UIKit.h> 

@interface ParentViewController : UIViewController 

- (void)passData:(NSString *)strText; 

@end 

ParentViewController.м

- (IBAction)btnGoToSecondView:(id)sender { 
    ChildViewController *secondVC = [[ChildViewController alloc] initWithNibName:@"ChildViewController" bundle:nil]; 
    secondVC.delegate = self; 
    [self presentViewController:secondVC animated:YES completion:nil]; 

} 

- (void)passData:(NSString *)strText { 
    NSLog(@"Data Passed = %@",strText); 
} 

ChildViewController.h

#import <UIKit/UIKit.h> 
#import "ParentViewController.h" 

@class ParentViewController; 

@interface ChildViewController : UIViewController 

@property(nonatomic, assign) ParentViewController *delegate; 

@end 

ChildViewController.m

- (IBAction)btnPassDataBack:(id)sender { 
    if([self.delegate respondsToSelector:@selector(passData:)]) { 
     [self.delegate passData:@"Hello"]; 
    } 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Sample Project

+0

@ S.J Пожалуйста, проверьте прилагаемый образец. – icodebuster

+0

Пожалуйста, можете ли вы рассказать, как это возможно в uinavigationcontroller –

+0

@ S.J. Это то же самое с UINavigationViewController – icodebuster

2

Это ребенок controller.h

@protocol childProtocol <NSObject> 
    -(void)childMethod:(NSArray*)params; 

@end 

@property (strong, nonatomic) id<childProtocol>childDelegate; 

@property (weak, nonatomic) parentVC *pVC; 

.m

if([self.childDelegate respondsToSelector:@selector(childMethod:)]) { 

    [self.childDelegate performSelector:@selector(childMethod:) withObject:self.arry];  

} 

Это мой родитель controller.h

#import <UIKit/UIKit.h> 
#import "ChildController.h" 


@interface perentController : UIViewController <childProtocol> 

.m

- (void)childMethod:(NSArray *)params { 
     // some work 
} 

Редакция:

И не забудьте добавить childViewOBJ.childDelegate = self; в момент создания ChildViewController's объекта. такие как,

childVC *cVC = [[childVC alloc]init]; 
cVC.childDelegate = self; 
cVC.pVC = self; 
[self presentModalViewController:cVC animated:YES]; 

Для получения дополнительной информации о How to create/use of Protocol.

+0

почему вы копируете вставить мой вопрос в качестве ответа, если вы верите в то, что я не сделал этого UIViewController , так что я ошибался, я уже это сделал. –

+0

@ S.J- Сначала проверьте это, это не совсем так же, как и ваш вопрос .. Я просто хочу помочь вам, ничего более нехорошо .... :) – iPatel

+0

, пожалуйста, проверьте мой вопрос снова. Я исправил ошибку в моей копии. –

0

Прежде всего, вы не проверяли тот же селектор, как вы заявили в своей декларации протокола, поэтому он не будет реагировать на это. Вы объявили метод childMethod:, тогда как вы проверяете, отвечает ли ваш childDelegate на селектор myMethod:, который не делает так, чтобы он не переходил в условие if.

Также в контроллере родительского представления отсутствует реализация метода childMethod: в его .m. Реализуйте это в своем родительском контроллере представления или он выйдет из строя из-за того, что не нашел точное определение селектора.

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

+0

Извините, скопируйте ошибку папок, в моем коде я вызываю правильный селектор. –

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