2015-07-28 3 views
-1

В принципе, теперь я намерен использовать делегат для передачи значений между контроллерами представлений.Делегат не отвечает на селектор

Поток контроллеров вида A -> B -> C с использованием push segue.

Когда пользователь выполняет какое-либо действие в контроллере вида «C», как передать значение BACK на первый контроллер представления, который является «A»?

В моем коде «self.delegate» всегда равно нулю, и метод делегата никогда не запускается.

Ниже приведен код первых ОК и третьего ВК:

Первого VC .m:

#import "ViewController.h" 
#import "ThirdViewController.h" 

@interface ViewController()<PassValueProtocal> 
@property (weak, nonatomic) IBOutlet UILabel *myLabel; 

@end 

@implementation ViewController 
{ 
    ThirdViewController *thirdVC; 
} 

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

- (void) passValueBack:(NSString *)value 
{ 
    NSLog(@"HAHAH"); 
} 

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


- (IBAction)segueToSecondVC:(UIButton *)sender 
{ 
    thirdVC = [ThirdViewController sharedManager]; 

    thirdVC.delegate = self; 
} 

@end 

Третьего VC .h:

#import <UIKit/UIKit.h> 

@protocol PassValueProtocal <NSObject> 
- (void) passValueBack: (NSString *) value; 
@end 

@interface ThirdViewController : UIViewController 

@property (weak, nonatomic) id<PassValueProtocal>delegate; 
+ (id) sharedManager; 

@end 

Третьего VC .m:

#import "ThirdViewController.h" 

@interface ThirdViewController() 
@property (weak, nonatomic) IBOutlet UITextField *myTextField; 

@end 

@implementation ThirdViewController 

+ (id) sharedManager 
{ 
    NSLog(@"myDelegate sharedManager"); 
    static ThirdViewController *sharedManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ sharedManager = [[self alloc] init]; }); 
    return sharedManager; 
} 

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

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

- (IBAction)passValueAction:(UIButton *)sender 
{ 
    NSLog(@"%@", self.delegate); 
    if ([self.delegate respondsToSelector:@selector(passValueBack:)]) 
    { 
     [self.delegate passValueBack:self.myTextField.text]; 
    } 
} 


@end 
+0

где код SecondVC, где вы нажимаете ThirdVC. В этот момент вам необходимо передать делегат от второго до третьего. Таким образом, у ThirdVC будет делегат. –

+0

@ iosDev82 Вы имеете в виду, что делегат может общаться только с двумя контроллерами представлений, которые связаны друг с другом? –

+0

Не обижайтесь, но ваш вопрос действительно болен. Сначала вы говорите о 3 VC, но ваш код имеет 2 контроллера вида. –

ответ

1

Ваш код

- (IBAction)segueToSecondVC:(UIButton *)sender 
{ 
    thirdVC = [ThirdViewController sharedManager]; 

    thirdVC.delegate = self; 
} 

Не должно быть здесь. Вы должны реализовать функцию prepareForSegue и переместить туда этот код. Что-то вроде

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
ThirdViewController *thirdVC = (ThirdViewController *)segue.destinationViewController; 
thirdVC.delegate = self; 

} 
+0

Большое спасибо! Я знаю, как использовать делегат между двумя контроллерами представлений, просто используя метод, который вы предоставляете. Но этот, кажется, выходит из первого VC непосредственно в третий VC? Потому что firstVC destinationVC должен быть secondVC вместо третьего VC. Следовательно, есть ли все равно, чтобы передать значение из третьего VC обратно в первый VC, но segue проходит через firstVC -> secondVC -> thirdVC? –

+0

Кроме того, можно ли передавать значение с третьегоVC обратно в firstVC напрямую? –

+0

@MikeZhu В вашем коде, который вы поделили, у вас есть кнопка, которая выполняет какой-то переход от FirstVC к ThirdVC. В любом случае вы должны установить делегат в 'prepareForSegue' и сделать то же самое в' prepareForSegue' SecondVC. На этот раз вы должны передать делегата SecondVC (который является fristVC) делегату ThirdVC. После того, как вы делегируете в ThirdVC, вы можете передать сообщение непосредственно ему. –