我是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文件中执行此操作。

07-25 20:37