iOS 使用委托传值不触发方法

iOS use the delegate pass value not trigger the method

我正在测试委托传递 objective-c 中的值。

我知道还有其他方法可以在 UIViewController 之间传递字符串,例如 NSNotifyCenter..等

现在我想尝试使用委托传递值。

但是我遇到了一些问题。

我使用导航,有两个 UIViewController(FirstUIViewcontroller 和 SecondUIViewController)。

现在我想使用手动更改为SecondUIViewController,而不是使用按钮拖动到FirstUIViewController处的SecondUIViewController。

所以我在 FirstUIViewController.m 按钮操作中添加了代码。

 - (IBAction)pushBtnAction:(id)sender {
     SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
     [self.navigationController pushViewController:controller animated:YES];
 }

然后我想在弹出视图控制器时从 SecondUIViewcontroller 传递值。

所以我添加了委托工具并在 FirstUIViewController.m 中设置了委托。

 - (void)viewDidLoad {
     [super viewDidLoad];

     UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
     secondVC = (SecondViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
     secondVC.delegate = self;
 }

 -(void) passSecondVC:(SecondViewController *)vc didAddValue:(NSString *)str
 {
     NSLog(@"second str:%@",str);

}

SecondUIViewController.h 中,我声明了委托方法。

 @class SecondViewController;
 @protocol SecondViewControllerDelegate <NSObject>

 @optional
 -(void)passSecondVC:(SecondViewController*)vc didAddValue:(NSString*) str;
 @end

 @interface SecondViewController : UIViewController

 @property (nonatomic,assign) id<SecondViewControllerDelegate> delegate;

 - (IBAction)passValueDelegatBtnAction:(id)sender;

SecondViewController.m,

当我点击按钮时会弹出自己的 uiviewcontroller 并将值传递给 FirstUIViewController。

 - (IBAction)passValueDelegatBtnAction:(id)sender {
     if( [self.delegate respondsToSelector:@selector(passSecondVC:didAddValue:)])
     {
         [self.delegate passSecondVC:self didAddValue:@"this is string from sencond vc"];
     }
     [self.navigationController popViewControllerAnimated:YES];

 }

(我的问题) 但是在这种状态下,我总是取不到FirstUIViewController中delegate方法中的值。

我曾在 FirstViewController.m

中尝试过如下所示的其他方法
 - (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
 {
     NSLog(@"segue");
     id vc = segue.destinationViewController;
         if( [vc isKindOfClass:[SecondViewController class]])
         {
             SecondViewController *secondVC = vc;
             secondVC.delegate = self;
         }
 }

有同样的问题。

我无法从委托方法中获取值。

有谁知道问题出在哪里?

我post我的完整代码在here.

非常感谢。

我下载了你的代码并修复了它。

你不想要这条线。所以评论吧,

//    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
//    secondVC = (SecondViewController*)[mainStoryboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
//    secondVC.delegate = self;

按如下方式编辑此方法,

- (IBAction)pushBtnAction:(id)sender {
    SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    controller.delegate = self;
    [self.navigationController pushViewController:controller animated:YES];
}

也将此方法编辑如下,

- (IBAction)passValueDelegatBtnAction:(id)sender {
//    if( [self.delegate respondsToSelector:@selector(passSecondVC:didAddValue:)])
//    {
        [self.delegate passSecondVC:self didAddValue:@"this is string from sencond vc"];
//    }
    [self.navigationController popViewControllerAnimated:YES];

}

好的!

viewDidLoad: 方法中删除代码并在推送 secondViewController 时设置委托。

- (IBAction)pushBtnAction:(id)sender {
    SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    [controller setDelegate:self];
    [self.navigationController pushViewController:controller animated:YES];
}

那到底出了什么问题?

答案:您在 viewDidLoad: 方法中创建了一个新对象,并将您的 firstViewController 设置为它的委托。现在,在推送时,您正在创建另一个未设置委托的 SecondViewController 对象。

您在 pushBtnAction 中忘记了一些代码..

- (IBAction)pushBtnAction:(id)sender {
    SecondViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; // It's different to VC you init in viewDidLoad 
    controller.delegate = self; // you forgot....
    [self.navigationController pushViewController:controller animated:YES];
}

prepareForSegue 在您使用 segue 导航时调用。