Iphone 有效地使用界面生成器

Iphone 有效地使用界面生成器,iphone,xcode,delegates,interface-builder,ibaction,Iphone,Xcode,Delegates,Interface Builder,Ibaction,我不熟悉iPhone和objective c。我花了好几个小时阅读文件,试图了解事情是如何运作的。我有RTFM或至少我在这个过程中 我的主要问题是,我想了解如何指定事件传递到何处,我唯一能够做到这一点的方法是指定委托,但我确信IB中有一种更简单/更快的方法 举个例子。 假设我有20个不同的视图和视图控制器以及一个MyAppDelegate。 我希望能够在IB中构建所有这些不同的Xib文件,添加任意多的按钮和文本字段,然后指定它们都在MyAppDelegate对象中生成一些事件。为此,我在IB列表

我不熟悉iPhone和objective c。我花了好几个小时阅读文件,试图了解事情是如何运作的。我有RTFM或至少我在这个过程中

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

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

然而,当我试着运行它时,它只是崩溃了,出现了一个错误的读取异常

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


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

如果在每个nib文件中创建一个MyAppDelegate实例,那么,是的,当所有nib加载时,最终会得到很多不同的类实例。应用程序委托不是通过类或协议来标识的,而是通过应用程序实例的
委托
属性所指向的对象来标识的。要找到真正的应用程序委托,必须向应用程序对象本身请求其委托

您应该让所有视图控制器从具有
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文件中执行此操作

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

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


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

好的,我会问一个稍微不同的问题。如何创建一个视图控制器来控制多个不同的视图,其中每个视图在单独的nib文件中定义。假设我在5个不同的nib中构建了5个视图,nib层次结构中除了视图之外没有其他内容。现在,我构建了一个带有视图控制器但没有视图的nib。如何使用运行时指定的视图初始化MyAppViewController。UIView中有这样做的选项吗?然后我是否必须将每个nib-with-only-a-view的文件所有者设置为MyAppViewController类型?或者应该怎么做?如果我说@property(非原子,保留)IBOutlet MyAppDelegateClass*appDelegate,然后将此基础Viewcontroller中的每个Viewcontroller子类化,然后在我的appDelegate本身中添加各种IBAction方法,那么肯定有某种方法可以在Interface builder中而不是在代码中连接这些IBOutlet?到目前为止,当从MyAppDelegateClass中加载视图控制器时,我只是通过编程方式将appDelegate属性设置为self,但我认为[UIApplication…]行会更好。但是IB中难道没有办法吗?应用程序委托是一个特定的实例。您必须指向该特定实例,否则无法到达实际的委托。简单地给一个类一个出口不会让它的子类指向一个特定的实例。这些出口中的每一个都必须链接到应用对象用作其代理的特定应用程序代理实例。Nib文件是模块化的,并且具有有限的范围。根据设计,它们不依赖于整个应用程序,甚至看不到应用程序对象。因此,只有应用程序对象本身拥有的nib(通常为MainWindo.nib)才能看到活动委托。如果希望在IB中连接此功能,可以创建一个小实用程序类,其功能是查找活动应用程序委托实例。然后,您可以将该类添加到任何随机nib,并将一个出口连接到该nib。这将允许您在nibs中管理对应用程序委托的访问,而无需子类化。好的,回答得很好。非常感谢您及时高效的回复。