Xcode新手新手新新手之主界面控件关系描述
Jeff zhu
2011年7月22日
文档描述:
本文档是基于Xcode4来进行描述的。
在我新学Xcode时(现在仍旧算是新学),新建了一个View Based project后,总是想弄清楚主界面各个控件之间是怎么关联起来的,主界面和子界面是怎么关联的,尤其是我在新建了一个window based project后,如何新添加sub view来达到和View Based project相同的效果。捉摸了n久后,发现一切的奥秘只是在界面文件(nib file)的Files Owner和NSObject以及window和RootViewController几个控件设置上面,因此把这方面的心得共享出来,希望对大家有所帮助。
以下内容中,按照新建一个Window Base Project的方式,添加一个子界面,使project能够达到和新建一个View Based project的相同的效果,同时在这些步骤中逐步描述各个控件的设置关系。
准备部分关于IBOutlet和IBAction的简单解释
在Delphi或者C++中,我们经常为向Form上放置控件,比如button控件,比如Edit控件等。在向界面上放置控件的时候,需要设置控件的Name。设置了Name后,就可以在代码中根据Name来对控件进行相应的更改,比如= ‘ABCED’。他实际的工作是将Name为Edit1的控件的文本内容设置为’ABCDE’。
在Objective-C中,向Form(View)上放置控件时,没有控件的Name属性,而要想在代码中对控件进行控制怎么办?只好手写。
手写的方式是在件中声明一个IBOutlet类型,然后手工将Form上的控件连接到Outlet上,这样就实现了代码中声明的名称和界面上控件的关系,就可以在代码上对该控件进行控制和设置了。
同样,对于某些控件的Event,在Delphi或者C++中自动为实现相关的联系,而在Objective-C中是没有自动建立联系的,那么怎么办?同样采用手工的方式。
首先在件中声明一个IBAction类型的函数,然后把控件的某个事件连接到该IBAction上,从而使控件的动作时调用连接的函数。
第一部分Window-based Application主界面控件关系描述
1 新建一个Window Based Application
使用File->New Project菜单来打开新建Project的功能。系统显示新建项目的界面,选择“Application”框中的Windows-based Application,然后点击“Next”按钮,如下图:
在显示的新的界面中设置Product的Name为testWindow,并选择设备类型为iPhone,然后点击“next”按钮。然后在界面中选择保存这个project的位置并保存。这样就建立了一个新的Window-based project项目。
2打开该project后,界面左侧显示有一堆的文件,当前我们主要描述的由三个文件,分别是:testWindowAppDelegate.h
testWindowAppDelegate.m
MainWindow.xib
如下图
3 testWindowAppDelegate.件
在该文件的代码中,关键的是声明了一个UIWindow的属性:
@property(nonatomic,retain)(IBOutlet)UIWindow *window;
一般情况下,我们在声明一个IBOutlet类型的时候,表示在nib文件(xib文件)的界面上,会有一个该
类型的控件和IBOutlet声明的接口连接。因此这里声明了一个UIWindow的IBOutlet,那么在xib 文件中肯定会有一个UIWindow的控件,并且该控件有个Outlet类型连接,连接到该声明。
我们打开xib文件,如下图:
在该图中,我们看到有一个Window控件,在该Window控件上点击鼠标右键,可以看到它连接到了TestWindowAppDelegate上。他是怎么连接上去的呢,我们在详细描述xib文件的时候再做说明。xcode怎么打开
4 testWindowAppDelegate.m文件
在该文件的代码中,关键是在application didFinishLaunching函数中的一行:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:……
{
[self.window makeKeyAndVisible];
Return YES;
}
该函数表示application程序载入成功后马上执行的代码。该代码将声明的window属性(该属性连接的是MainWindow.xib界面中的window控件)显示出来。
这句代码实际上完成的是window的显示。因此在主界面中必须有一个window控件,该控件必须和h 文
件中声明的IBOutlet连接到一起。
关于window的连接关系和其他的内容,详细见xib文件的描述。
5 MainWindow.xib文件
在该文件中,关键的有三个地方要弄明白,一个是Files Owner控件,一个是TestWindowAppDelegate (NSObject类型)控件,一个是window控件。他们之间的相互关系弄明白了,才能够清楚代码具体是怎么跑起来的。
首先对下文中的一些名词做出定义:
控件:指在xib文件中放置的控件,比如window控件,FilesOwner控件,TestWindowAppDelegate 控件等。
对象:指在件中声明的对象,比如在testWindowAppDelegate.件中就声明了一个对象:@Interface testWindowAppDelegate: NSObject <UIApplicationDelegate>
我们打开MainWindow.xib文件,界面显示如下:
他们之间的关系如下:
我们需要首先设置FilesOwner控件的class属性为UIApplication,在属性设置窗口的Identity Inspector中。然后设置TestWindowAppDelegate的class属性为testWindowAppDelegate(同样在属性窗口的Identity Inspector中)。
设置FilesOwner的class属性为UIApplication大概或许表示可以接收UIApplication的事件,然后把FilesOwner的Delegate设置为TestWindowAppDelegate控件,表示UIApplication的事件由TestWindowAppDelegate控件的class指定的testWindowAppDelegate对象(在testWindowApp- Delegate.件中声明的对象)来进行处理。
设置FilesOwner的Delegate必须在按下键盘的Ctrl键的不放开,使用鼠标选中FilesOwner对象,然后不放开鼠标从FilesOwner控件拖向TestWindowAppDelegate控件。如果反向拖动是无法建立的。
建立连接后我们可以检查连接是否正确建立。在FilesOwner控件上点击鼠标右键,在弹出菜单中就会发现在Outlet中有一个delegate连接到了TestWindowAppDelegate控件。同样在TestWindowApp- Delegate控件上点击鼠标右键,同样会发现在Referencing Outlet中有一个delegate指向了FilesOwner。
将TestWindowAppDelegate控件中的window属性连接到window控件的方法是按下键盘的Ctrl键后,使用鼠标选中TestWindowAppDelegate,按下鼠标左键不松开状态下拖向window控件。然后在弹出的小黑框中选择window即可。这样,就把TestWindowAppDelegate控件的class指向的对象声明中声明的Outlet window连接到了window控件。
检查连接是否存在或者正确的方式同样是在TestWindowAppDelegate控件上点击鼠标右键,弹出界面中的Outlet中的window是否连接到了window控件。在window控件上点击鼠标右键,在弹出菜单中检查Referening Outlets中是否是window连接到了window控件。
我们回过头来再看testWindowAppDelegate.m文件中的didFinishLaunchingWithOption函数。
- (BOOL)application:(UIApplication *) application didFinishLaunchingWithOptions:……
{
[self.window makeKeyAndVisible];
Return YES;
}
Self.window中的window是在件中声明的一个Outlet,同时在xib的界面文件中,将界面上的window控件连接到了该Outlet上。因此将该window makeKeyAndVidible实际上是把xib文件中的window控件显示出来。
同时,我们设置了xib界面文件中的FilesOwner的class为UIApplication,并设置了FilesOwner
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论