【问题标题】:No known instance method for selector--delegate issue?没有已知的选择器实例方法——委托问题?
【发布时间】:2014-03-06 22:36:30
【问题描述】:

我收到上述错误,我不知道为什么。标记错误的行是:

- (IBAction)cancelButton:(UIBarButtonItem *)sender
{    
    [self.delegate addActivityViewControllerDidCancel:self.thisActivity];
}

我很困惑,因为这个方法似乎没有问题,就在前面:

- (IBAction)saveButton:(UIBarButtonItem *)sender
...          
    [self.delegate addViewControllerDidSave];
}
...       
}

我的协议在相关的头文件中是这样声明的:

@protocol AddActivityViewControllerDelegate <NSObject>

-(void) addViewControllerDidSave;

-(void) addViewControllerDidCancel:(WMDGActivity *) activityToDelete;

@end

并且方法在委托对象中是这样实现的:

-(void) addActivityViewControllerDidSave
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [localContext MR_saveToPersistentStoreAndWait];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

-(void) addActivityViewControllerDidCancel:(WMDGActivity *) activityToDelete
{
    [activityToDelete MR_deleteEntity];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

谁能指出我的错误?

编辑:

确实存在命名问题(我是从测试应用粘贴的)。但是,我已经纠正了它,我相信,就像这样:

@protocol AddActivityViewControllerDelegate <NSObject>

-(void) AddActivityViewControllerDidSave;

-(void) AddActivityViewControllerDidCancel:(WMDGActivity *) activityToDelete;

@end

还有

- (IBAction)saveButton:(UIBarButtonItem *)sender

{
...
    [self.delegate AddActivityViewControllerDidSave];
...
}

- (IBAction)cancelButton:(UIBarButtonItem *)sender
{    
    [self.delegate addActivityViewControllerDidCancel:self.thisActivity];
}

-(void) addActivityViewControllerDidSave
{
    NSManagedObjectContext *localContext = [NSManagedObjectContext MR_contextForCurrentThread];
    [localContext MR_saveToPersistentStoreAndWait];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

-(void) addActivityViewControllerDidCancel:(WMDGActivity *) activityToDelete
{
    [activityToDelete MR_deleteEntity];
    [self.navigationController dismissViewControllerAnimated:YES completion:nil];
    [self refreshData];

}

还是报错。

即使有@Leo 建议的断点,构建也会失败

【问题讨论】:

  • @bneely 回复您的答案。这是正确的。里奥错了。
  • 这看起来像是self.delegate 类型为id 而不符合相关协议的问题。
  • 请参阅上面的编辑。
  • @LeoNatan id 是一种类型。它位于 iOS 7.0.4 SDK 第 46 行的 objc.h 中。
  • @LeoNatan 如果您知道答案,请发布答案。谢谢。

标签: ios delegates protocols


【解决方案1】:

您的代码有几个问题:

  • 您的协议定义了不带 Activity 字样的方法名称,但您的实现定义了带有字词 Activity 的方法名称,因此这些方法名称不匹配。您可以依靠完成或复制粘贴来实现协议方法并确保方法签名匹配。
  • self.delegate 可能只是类型id,它不符合特定协议。编译器无法知道self.delegate 可以响应您的协议方法。将该行更改为:

    [(id&lt;AddActivityViewControllerDelegate&gt;)self.delegate addActivityViewControllerDidCancel:self.thisActivity];

【讨论】:

  • id 绝对是一个类型:objc.htypedef struct objc_object *id;
  • @TimJones 您是否尝试过我在第二个要点中对您的代码建议的编辑?
  • @bneely 一直以为是运行时异常
  • @TimJones 慢下来,花点时间校对。检查协议中方法名称的大小写,如何调用这些方法以及如何实现这些方法。确保所有三个匹配。
  • 就是这样,@rmaddy!我简直不敢相信,但是当我回溯我的步骤时,最初的问题是 bneely 看到的,协议和方法之间的名称不一致。我通过从协议声明中选择并复制“AddActivity”并将其粘贴以替换我原始方法声明的“添加”来纠正该问题。这修复了拼写,但引入了大写问题,引发了相同的异常。占用您这么多时间,我深表歉意!我认为给 bneely 打上绿色复选标记和赞成票是合适的,但感谢所有人!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多