【问题标题】:unable to receive callback from second view controller无法从第二个视图控制器接收回调
【发布时间】:2017-02-13 05:25:45
【问题描述】:

我有两个视图控制器。我试图将数据传递给前一个视图控制器

我的第二个视图控制器中有以下代码CEPeoplePickerNavigationController

@class CEPeoplePickerNavigationController;
@protocol CEPeoplePickerNavigationControllerDelegate <NSObject>
- (void)previousViewController:(CEPeoplePickerNavigationController *)controller itemToSend:(NSString *)item;
@end


@interface CEPeoplePickerNavigationController : UIViewController <UITableViewDelegate,UITableViewDataSource>{
}
@property (nonatomic, retain) id < CEPeoplePickerNavigationControllerDelegate> peoplePickerDelegate;
@end

当用户点击完成按钮时,将执行以下代码

- (void)doneAction:(id)sender
{
    [self.peoplePickerDelegate previousViewController:self itemToSend:@"From Previous VC"];
    [self dismissViewControllerAnimated:YES completion:nil];
}

在我的第一个视图控制器中,我在头文件中有以下接口,当然我在我的第一个视图控制器中实现了 previousViewController 方法,其中必须接收数据

@interface CallViewViewController : UIViewController<CEPeoplePickerNavigationControllerDelegate>
@end

当我从第一个视图控制器移动到第二个视图控制器时,我使用以下代码。

CEPeoplePickerNavigationController *nextVc = [[CEPeoplePickerNavigationController alloc] init];
    nextVc.peoplePickerDelegate = self;

    [self presentViewController:nextVc animated:YES completion:nil];

但是当用户从第二个视图控制器单击完成按钮时,我在我的第一个视图控制器中没有收到任何回调。为什么会这样?

我已经实现了如下接口,

- (void)previousViewController:(CEPeoplePickerNavigationController *)controller itemToSend:(NSString *)item
{
    NSLog(@"from CEPeoplePickerNavigationController %@",item);
}

更新:

以下代码有效

if ([[CallViewViewController new] respondsToSelector:@selector(previousViewController:item:)]) {
    [self.viewCrtrlDelegate previousViewController:self item:@"Here I am"];
    [self dismissViewControllerAnimated:YES completion:nil];
}
else{
   NSLog(@"Your delegate was properly set");
}

但如果我按照以下方式尝试,它不起作用

if ([[self.viewCrtrlDelegate respondsToSelector:@selector(previousViewController:item:)]) {
    [self.viewCrtrlDelegate previousViewController:self item:@"Here I am"];
    [self dismissViewControllerAnimated:YES completion:nil];
}
else{
   NSLog(@"Your delegate was properly set");
}

这就是我实例化视图控制器的方式。

CEPeoplePickerNavigationController *nextVc = [[CEPeoplePickerNavigationController alloc] init];

    nextVc.viewCrtrlDelegate = self;
    [self presentViewController:nextVc animated:YES completion:nil];

【问题讨论】:

  • 方法执行与否
  • 显示完成按钮的按钮动作。
  • 我已经附上了完成的按钮操作
  • 虽然我在第一个视图控制器中实现了CEPeoplePickerNavigationControllerDelegate,但第一个视图控制器中的回调方法没有被执行或调用
  • 有什么想法吗?.....

标签: ios objective-c callback delegates


【解决方案1】:

您的代码似乎绝对正确,但要避开所有可能性。 你能检查一下你的完成按钮动作是否检查了该类中的委托方法是否可用?

if ([self.viewCrtrlDelegate respondsToSelector:@selector(previousViewController:item:)]) {
    [self.viewCrtrlDelegate previousViewController:self item:@"Here I am"];
    [self dismissViewControllerAnimated:YES completion:nil];
}
else{
   NSLog(@"Your delegate was properly set");
}

【讨论】:

  • 正在执行其他循环
  • 这说明你的delegate没有正确设置。检查你是否在你的第一堂课中提供了delegate方法的实现。
  • 我已经提供了。我会更新我注意到的问题
  • 您可以检查您是否正确实例化了第二个类。就像您使用情节提要实例化控制器一样。然后用这个。 ViewController2 *ctrl = [self.storyboard instantiateViewControllerWithIdentifier:@"identifier_of_your_controller_in_storyboard"];
  • 或者如果你有一个单独的 nib 文件,你可以使用 ViewController2 *ctrl = [[ViewController2 alloc] initWithNibName:@"your_nib_name" bundle:nil];
猜你喜欢
  • 2017-12-10
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-19
  • 2014-02-25
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多