【问题标题】:Delegate method in second ViewController not called未调用第二个 ViewController 中的委托方法
【发布时间】:2015-11-10 23:02:21
【问题描述】:

我想将数据从我的一个控制器传递到另一个。为此,我在第二个视图控制器中实现委托(它在第一个视图控制器上使用点击“加号”按钮时调用):

委托声明:

@protocol AddTaskDelegate <NSObject>

-(void)addTask:(NSString*)task byDate:(NSDate*)date;

@end

委托的实现:

- (IBAction)addTask:(id)sender {

    if ([self.addTextField.text length] >0){

        NSDate *now = [NSDate date];

        [self.delegateObj addTask:self.addTextField.text byDate:now];
        [self dismissViewControllerAnimated:YES completion:nil];

    }   else {

        NSLog(@"You should type something");
    }

}

viewController1:

addController.delegateObj = self;
...

然后:

   -(void)addTask:(NSString *)task byDate:(NSDate *)date  {

    myDateToFill  = date;
    myStringToFill = task;
    NSLog(@"myStringToFill is - %@", task);
    NSLog(@"method called");

}

然而,addTask 方法未被调用(它假定返回在第二个视图控制器中计算的值)。我错过了什么?

更新:

我更新了我的 addTask 方法以进行跟踪并确定我的委托对象为 nil:

- (IBAction)addTask:(id)sender {

    if ([self.addTextField.text length] >0){

        NSDate *now = [NSDate date];
        NSLog(@"Prepare for repair");

        if (self.delegateObj == nil){
            NSLog(@"ALARM");
        }

        [self.delegateObj customMethod];
        [self.delegateObj taskAdded:self addTask:self.addTextField.text byDate:now];
        [self dismissViewControllerAnimated:YES completion:nil];

    }   else {

        NSLog(@"You should type something");
    }



}

现在在控制台中我可以看到“警报”输出,它告诉我 self.delegateObj 出于某种原因为 nil。

已更新。之后解决(并从实现中删除对 AddTask 控制器的引用):

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    // Если нету navigation Controller'a

    if ([segue.identifier isEqualToString:@"add"]){

        UINavigationController *navController = [segue destinationViewController];
        AddViewController   *addController = (AddViewController*)([navController viewControllers][0]);
        addController.delegate = self;
    }

}

【问题讨论】:

  • 您是否在protocol 中符合ViewController1.h 中的代表?
  • 是的,我做到了。也许我忘了在委托方法中传递对 ViewControllerB 的引用?
  • viewController1中addController的引用在哪里设置
  • @zcui93 在实现中:AddViewController *addController;,然后在 viewDidLoad:addController.delegateObj = self;
  • 能否在 AddController 中包含将委托设置为 viewController1 实例的代码

标签: ios objective-c delegates


【解决方案1】:

您是否在ViewController1.h 中实现了以下内容?

@interface ViewController1<AddTaskDelegate>
// ...
@end

在 AddTaskDelegate.h 中,缺少以下行

@property (nonatomic, weak) id <AddTaskDelegate> delegate;

在 AddTaskDelegate.m 中,添加以下内容

@synthesize delegate;

此外,我强烈建议您查看以下主题,尤其是@Tibidabo 的回答:How do I create delegates in Objective-C?

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 1970-01-01
    • 2016-01-17
    • 1970-01-01
    • 1970-01-01
    • 2011-08-12
    相关资源
    最近更新 更多