2010-04-25 58 views
3

我是iPhone和目标c的新手。我花了数小时,数小时阅读文件,并试图理解事情的工作方式。我有RTFM或至少在这个过程中。有效地使用Interface Builder

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

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

但是,当我尝试运行它时,它只是崩溃与一个错误的读取异常。

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

所以我的问题是......我该怎么做呢?

回答

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文件做到这一点。

+0

如果我说 @属性(非原子,保留)IBOutlet中MyAppDelegateClass *的appDelegate ,然后从子类这个基地的viewController我viewcontrollers的每一个,然后添加在我的AppDelegate各种IBAction为方法本身那么肯定有某种方式来连接那些IBOutlets在Interface Builder中而不是在代码中?到目前为止,我已经通过编程将appDelegate属性设置为self,从MyAppDelegateClass中加载视图控制器,但我认为[UIApplication ...]行会更好。但在IB中没有办法? – twerdster 2010-04-26 19:42:27

+1

应用程序委托是特定的实例。你必须指向那个特定的实例,或者你没有到达实际的委托。简单地给一个类插座不会让它的子类指向特定的实例。这些出口中的每一个都必须链接到应用程序对象用作其委托的特定应用程序委托实例。 – TechZen 2010-04-26 23:17:42

+1

笔尖文件旨在模块化,并有一个限制范围。按照设计,它们不依赖于,也不能看到整个应用程序甚至应用程序对象。因此,只有应用程序对象本身拥有的笔尖(通常是MainWindo.nib)才能看到活动的委托。 – TechZen 2010-04-26 23:18:17

0

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

1

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

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

+0

好的,我会问一个稍微不同的问题。如何创建一个视图控制器来控制许多不同的视图,其中每个视图是在单独的nib文件中定义的。可以说,我在5个不同的笔尖中构建了5个视图,除了视图之外,在笔尖层次结构中没有其他东西。现在我用视图控制器构建一个笔尖,但没有视图。我如何用运行时指定的视图初始化MyAppViewController。有没有UIView中的选项来做到这一点?然后,我必须将每个只有一个视图的nib的文件所有者设置为MyAppViewController类型吗?或者应该怎么做? – twerdster 2010-04-26 19:28:43