我需要将我的根UIViewController设置为其模态子UIViewControllers(runwayAnalysisViewController)的委托。我实现了我的根UIViewController采用的委托协议。
[runwayAnalysisViewController setSettingsDelegate: self];
(自己是父UIViewController)
不幸的是,我收到了经典错误,“runwayAnalysisViewController可能无法响应”-setSettingsDelegate:方法。“
委托在RunwayAnalysisViewController类中声明为:
id <SettingsRequestDelegate> settingsDelegate;
-thence:
@property(nonatomic, assign) id <SettingsRequestDelegate> settingsDelegate;
它也在.m文件中合成。
我尝试过合成存取器和放大器。委托的mutator方法以及手动编写相同但无效的方法。
(其他尝试,在接口中声明的方法,如图所示实现:)
-(void)setSettingsDelegate:(id)aDelegate {
settingsDelegate = aDelegate;
}
-(id)settingsDelegate {
return settingsDelegate;
}
奇怪的是,虽然这个警告仍然存在,但我实现了这个委托的单一方法如下:
#pragma mark - SettingsRequestDelegate Methods
-(void)userDidRequestSettingsAccess:(id)sender {
NSLog(@"User did request settings access");
}
我能够从委托发送到父UIViewController的成功消息!任何帮助将不胜感激。
答案 0 :(得分:1)
您是否在父视图控制器的* .m文件的开头导入子控制器的* .h文件?
(并且是* .h文件中包含的@property
行?)
答案 1 :(得分:0)
您需要声明您的根UIViewController符合其头文件中的SettingsRequestDelegate。所以你现在可能在哪里:
@interface RootViewController: UIViewController
你会想要:
@interface RootViewController: UIViewController <SettingsRequestDelegate>
这只是一个警告,因为在Objective-C中,所有方法调用调度都是动态解析的,并且对象响应的方法可以在运行时更改(尽管不是在语法上非常漂亮)。因此,即使编译器在编译时认为您可能犯了一个错误,但它确实无法确定。
您正在使用正式协议正在尝试为编译器提供一些有用的东西,以便为您提供有用的警告。它们根本不在Objective-C的早期版本和一些非正式协议中(即,委托必须具有某些方法,但是只在API文档中记录它们 - 编译器完全脱离循环)甚至早期存活iOS版本。