在ApplicationDelegate中调用View Controller方法 - 警告我......但也有效

时间:2010-11-23 23:22:05

标签: iphone objective-c cocoa-touch

我需要将我的根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的成功消息!任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

您是否在父视图控制器的* .m文件的开头导入子控制器的* .h文件?

(并且是* .h文件中包含的@property行?)

答案 1 :(得分:0)

您需要声明您的根UIViewController符合其头文件中的SettingsRequestDelegate。所以你现在可能在哪里:

@interface RootViewController: UIViewController

你会想要:

@interface RootViewController: UIViewController <SettingsRequestDelegate>

这只是一个警告,因为在Objective-C中,所有方法调用调度都是动态解析的,并且对象响应的方法可以在运行时更改(尽管不是在语法上非常漂亮)。因此,即使编译器在编译时认为您可能犯了一个错误,但它确实无法确定。

您正在使用正式协议正在尝试为编译器提供一些有用的东西,以便为您提供有用的警告。它们根本不在Objective-C的早期版本和一些非正式协议中(即,委托必须具有某些方法,但是只在API文档中记录它们 - 编译器完全脱离循环)甚至早期存活iOS版本。