3

我是 iPhone 和目标 c 的新手。我花了几个小时和几个小时阅读文档并试图了解事情是如何运作的。我有 RTFM,或者至少正在处理中。

我的主要问题是我想了解如何指定事件传递到的位置,并且我能够做到这一点的唯一方法是指定委托,但我确信在 IB 中有一种更简单/更快的方法。

所以,举个例子。假设我有 20 个不同的视图和视图控制器以及一个 MyAppDelegate。我希望能够在 IB 中构建所有这些不同的 Xib 文件并添加许多按钮和文本字段等等,然后指定它们都在 MyAppDelegate 对象中产生一些事件。为此,我在 IB 列表视图的每个视图控制器中添加了一个 MyAppDelegate 对象。然后我在 XCode 中的 MyAppDelegate 中创建了一个 IBAction 方法并返回到 IB 并将所有事件链接到每个 Xib 文件中的 MyAppDelegate 对象。

但是,当我尝试运行它时,它会因读取异常而崩溃。

我的猜测是,每个 Xib 文件都放置了一个 MyAppDelegate 对象指针,该指针与最终将在运行时实际创建的 MyAppDelegate 地址无关。

所以我的问题是……我该怎么做?!!!

4

3 回答 3

4

如果您在每个 nib 文件中创建 MyAppDelegate 的实例,那么,是的,当所有 nib 加载时,您最终会得到该类的许多不同实例。应用程序委托不是由类甚至协议标识的,而是由应用程序实例的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 文件中做到这一点。

于 2010-04-25T22:01:10.487 回答
1

我不完全清楚你到底想做什么,但这可能是个坏主意。每个应用程序应该只有一个应用程序委托,它应该处理整个应用程序的行为。通常,应用程序委托初始化根视图控制器并显示它们,但仅此而已(除了处理诸如打开和保存数据源之类的事情)。

视图控制器(的子类UIViewController)应该与 XIB 交互。在视图控制器中具有特定于视图的行为使应用程序更易于管理和维护。通常,每个视图控制器应该有 0 或 1 个 XIB(比这更复杂)。您使用带有 IBOutlets 和 IBActions 的 Target/Action 模式设置与视图的交互(请参阅此处以获取完整指南)。使视图控制器或 XIB 依赖于应用程序委托通常是一个坏主意(因为再次减少依赖关系会使代码更易于管理)。

于 2010-04-26T01:56:04.800 回答
0

一般来说,您应该为正在构建的每个视图创建一个视图控制器,并将事件链接到这些视图控制器 - 而不是应用程序委托。事实上,通常不会有任何事件从任何 nib 文件连接到应用程序委托,即使在示例项目中,您也会注意到视图控制器是由应用程序委托创建并保存的,但它不接收事件。

于 2010-04-26T01:34:32.903 回答