为什么这个代表 - 协议没有响应?

时间:2012-04-25 12:39:02

标签: objective-c ios delegates protocols

我有一个名为dateSelectViewController的方法在我的.h文件中声明为协议:

@class DateSelectViewController;
@protocol DateSelectViewControllerDelegate 

- (void)dateSelectViewController:(DateSelectViewController *)sender
                         theDate:(id)stringDate;

@end

在协议下面,我宣布代表:

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

在实现文件中,我合成了委托,并在我的视图中按下完成按钮时向委托发送消息:

- (IBAction)DonePressed:(id)sender {
    NSDate *chosen = [datePicker date];
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];

    [formatter setDateFormat:@"MM/dd/yyyy"];
    NSString *formatedDate = [formatter stringFromDate:chosen];

    //sending a message to the delegate
    [self.delegate dateSelectViewController:self theDate:formatedDate];

    [self.navigationController popViewControllerAnimated:YES];
}

在被委派给的.h文件中,我正在导入委托人.h文件。在.m文件中,我符合协议:

@interface MakePlantTVC ()<DateSelectViewControllerDelegate>
- (void)dateSelectViewController:(DateSelectViewController *)sender
                     theDate:(id)stringDate
{
    self.displayDate.text = stringDate;
    NSLog(@"delegate working");
}

出于某种原因,这一点起作用了。当在我的委托者类中按下完成按钮时,该按钮会按预期执行并弹出视图控制器,但就像消息永远不会发送给代理一样。起初我以为我可以向nil发送消息,但是它的类型为id,所以情况应该不是这样。为什么没有发送消息?

1 个答案:

答案 0 :(得分:6)

想到了一些事情

  • 您是否设置了代理人?这可能听起来很愚蠢,但是当一个代表不能工作时,因为我忘记或失去了IB连接,90%的时间。
  • 你的弱物是否会过期?一个弱的对象是没有的 - 因此你正在对'无'进行委托操作 - 也许你想要更多的零售或NSNotification

我与可能有用的代表一起练习的其他事情

  • 使用基于断言的编程?如果您拥有具有所需功能的协议,则值得断言,即:NSAssert(delegate, @"Error, delegate not set!");
  • 检查委托是否响应选择器
  • 与GCD异步调度委托调用,即:

    dispatch_async(dispatch_get_main_queue(), ^{
      if ([delegate_ respondsToSelector:@selector(updateUI:)]) 
        [delegate_ updateUI:self];
    });
    

希望这有帮助!