我是iPhone和目标c的新手。我已经花了很多时间阅读文档,并试图理解事物的工作原理。我有RTFM或至少正在进行中。
我的主要问题是,我想了解如何指定事件传递到的位置,而我能够做到的唯一方法是通过指定委托,但是我确定IB中有一种更简单/更快捷的方法。
举个例子。
可以说我有20个不同的视图和视图控制器以及一个MyAppDelegate。
我希望能够在IB中构建所有这些不同的Xib文件,并添加许多按钮和文本字段等,然后指定它们都在MyAppDelegate对象中产生一些事件。为此,我在IB列表视图的每个视图控制器中添加了MyAppDelegate对象。然后,我在XCode的MyAppDelegate中创建了IBAction方法,然后返回到IB,并将所有事件链接到每个Xib文件中的MyAppDelegate对象。
但是,当我尝试运行它时,它崩溃并带有错误的读取异常。
我的猜测是,每个Xib文件都放置了一个MyAppDelegate对象指针,该指针与最终将在运行时创建的MyAppDelegate地址无关。
所以我的问题是...我该怎么做?!
最佳答案
如果在每个笔尖文件中创建MyAppDelegate的实例,是的,当所有笔尖加载时,您的确会得到该类的许多不同实例。应用程序委托不是通过类甚至协议来标识的,而是通过应用程序实例的delegate
属性指向的对象来标识的。要找到真正的应用程序委托,您必须向应用程序对象本身寻求委托
您应该使所有视图控制器都来自具有appDelegate
属性的父视图控制器类。实现这样的事情:
#import "MyAppDelegateClass.h"
@interface ViewControllerBaseClass :UIViewController {
MyAppDelegateClass *appDelegate;
}
@property(nonatomic, retain) *appDelegate;
@end
@implementation ViewControllerBaseClass
@synthesize appDelegate;
-(MyAppDelegateClass *) appDelegate{
self.appDelegate=(MyAppDelegateClass *)[[UIApplication sharedInstance] delegate];
return appDelegate;
}
@end
当视图控制器需要应用程序委托时,它仅调用
self.appDelegate
。如果要访问应用程序委托的属性,请使用self.appDelegate.attributeName
。重要的是您在运行时向应用程序请求其特定的委托实例。您不能从nib文件中执行此操作。