添加视图控制器(UIViewController)

📅 2026/7/5 11:42:08
添加视图控制器(UIViewController)
添加视图控制器文件在iPhone应用程序中视图控制器(UIViewController)起着核心作用。顾名思义视图控制器负责管理控制视图。在iPhone上它们也帮助进行导航和内存管理。选中Xcode项目管理器里的项目即SayHello项目位于Groups and Files列表的顶部或者选中SayHello文件夹——新文件在添加时会被加入到当前选择的位置。 选中后在Xcode菜单中选择 File New New File也可以在选中的文件夹上面点右键选择 New File。在New File窗口中请选择Cocoa Touch然后选择UIViewController subclass。点击 Next 按钮在Options窗口请勾选 “With XIB for user interface”复选框。选中 “With XIB for user interface”后Xcode在创建视图控制器的同时会为其创建一份nib文件并将该文件添加到项目中。点击Next按钮在其后出现的保存文件窗口中为文件起个名字例如RootTimelineViewController并选择文件存储的位置如下所示点击 Save文件会被添加到项目中。接下来我们将创建控制器类的实例。创建视图控制器实例现在我们有了视图控制器的类和nib文件但要在应用程序代理中使用它还必须创建类的实例并且将实例存储在变量中以便操作它。在应用程序委托类的头文件(即SayHelloAppDelegate.h)中执行下述操作在一个类中访问另一个类首先需要引用被访问类的头文件。所以我们先在应用程序委托头文件(SayHelloAppDelegate.h)的接口声明前面-即SayHelloAppDelegate声明前面引用视图控制器(RootViewController)的头文件#import RootViewController.h然后在头文件大括号之间添加下面的代码这是为了向应用程序委托添加一个实例变量RootViewController *viewController;在大括号之后 end之前添加下面的属性声明property (nonatomic, retain) RootViewController *viewController;在头文件中添加完相应变量和属性申明后需要在对应的实现文件中合成属性的存取方法在dealloc方法中释放视图控制器的实例。在应用程序委托类的实现文件(即SayHelloAppDelegate.m)中执行下述操作在类的 implementation代码块中通知编译器为视图控制器合成存取方法synthesize viewController;在dealloc方法起始处释放视图控制器[viewController release];我们已经把视图控制器属性添加到应用程序的委托现在需要实际创建一个视图控制器实例并将其设置为属性的值。在应用程序委托类实现文件即SayHelloWorldAppDelegate.m文件中的applicationDidFinishLaunching: 方法开头添加如下代码这些代码用于创建一个RootViewController实例RootViewController *controller [[RootViewController alloc]initWithNibName:RootViewController bundle:nil];self.viewController controller;[controller release];这段代码的作用如下创建RootViewController这个视图控制器的实例。使用alloc方法创建一个视图控制器然后用initWithNibName:bundle:方法对其进行初始化。init方法先指定控制器应加载的nib文件然后指定在哪个程序包中可找到该文件。程序包是文件系统某个位置的抽象该位置存放了应用程序将会用到的代码和资源。使用属性的存取方法将创建好的视图控制器实例设置为viewController属性变量的值根据内存管理规则释放视图控制器视图控制器用来配置和管理在应用程序中看到的视图每一个视图也对应有一个视图控制器来管理。窗体window有一个根视图控制器——这个视图控制器负责配置当窗体显示时最先显示的视图。要让你的视图控制器的内容显示在窗体中需要去设置窗体的根视图控制器为你的视图控制器。所以我们的项目中在上面创建视图控制器实例代码后面再添加一行代码来设置窗体的根视图控制器为我们新添加的视图控制器self.window.rootViewController controller;最后一行来自于Xcode提供的模板自动生成的代码[self.window makeKeyAndVisible];这行代码会让包含了视图控制器视图的Window窗口显示在屏幕上。本章完整代码SayHelloAppDelegate.h文件#import UIKit/UIKit.h#import RootViewController.hinterface SayHelloAppDelegate : NSObject UIApplicationDelegate {RootViewController *viewController;}property (nonatomic, retain) IBOutlet UIWindow *window;property (nonatomic, retain) RootViewController *viewController;endSayHelloAppDelegate.m文件#import SayHelloAppDelegate.himplementation SayHelloAppDelegatesynthesize window_window;synthesize viewController;- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{RootViewController *controller [[RootViewController alloc]initWithNibName:RootViewController bundle:nil];self.viewController controller;[controller release];self.window.rootViewController controller;[self.window makeKeyAndVisible];return YES;}- (void)dealloc{[_window release];[viewController release];[super dealloc];}end测试运行在Xcode的菜单中选择 Product Run 或者点击左上角工具栏上的 Run 按钮iPhone模拟器应该会自动启动。当应用程序启动后还是看到一个白色屏幕不过第一次看到的白色屏幕是应用程序代理中的Window而这次看到的白色屏幕是视图控制器RootViewController中的视图。下一步我们将开始对界面进行编辑。编辑Nib文件在iPhone开发中一般都会用NIB文件来来负责界面显示也就是MVC模型里面的视图对象而NIB文件只包含用户界面元素不包含任何源码那么怎么让视图对象和视图控制器关联起来呢这就需要用到两个非常重要的概念插座变量outlet和文件拥有者代理对象Files Owner。视图控制器的视图和Nib文件视图控制器主要的职责就是配置和管理应用程序中所有的视图一般来说视图控制器的视图是放在一个Nib文件中当然也可以不需要Nib文件通过程序创建视图典型的如UITableViewController这样的视图控制器就可以不需要Nib文件。在创建视图控制器实例时其中一个主要的构造函数initWithNibName:bundle:的第一个参数就是视图控制器对应的Nib文件的名字。视图控制器在其 loadView 方法中加载它的Nib文件。如果是使用initWithNibName:bundle:构造函数生成的实例并且你想在视图加载完成后进行额外的设置只要重写视图控制器的 viewDidLoad 方法就好了。在Xcode中点击打开视图控制器的Nib文件即RootViewController.xib文件在Xcode中即可直接查看和编辑。文件包含三个对象文件拥有者代理Files Owner第一响应者代理First Responder以及一个视图View。视图View是视图控制器的主视图在主视图中还可以添加若干子视图。文件拥有者代理(Files Owner)代表Nib文件对应的视图控制器类。理解文件所有者代理的角色以及如何建立文件所有者和Nib文件中界面元素之间的连接是非常重要的。小贴士 在Xcode中编辑Nib文件时可以通过点击右上角工具栏按钮显示隐藏相应面板方便对界面编辑和属性设置。文件拥有者(Files Owner)在一个Nib文件中文件拥有者对象是其中最重要的对象之一因为正是通过它来建立起应用程序代码和Nib界面文件中对象之间的连接具体来说它就是对应Nib文件的视图控制器对象。以本项目为例RootViewController.xib这个Nib文件的文件拥有者对象就是RootViewController类的实例。一般来说在使用模板同时创建UIViewController文件和对应的Nib文件时它默认会设置Nib文件对应的文件拥有者为创建的UIViewController类。如果要修改或者设置Nib文件对应的文件拥有者可以使用 Identity Inspector 面板进行设置。如上图所示 本项目的RootViewController.xib文件对应的文件所有者在Identity Inspector 面板中Custom Class部分的Class项可以看到对应的值是RootViewController这表示文件拥有者就是RootViewController类的实例就可以在Xcode中访问文件拥有者类里面标志为IBOutlet的属性和IBAction的方法和Nib文件中的界面元素建立关联。视图插座变量在Xcode中使用 Inspector 面板或者在连接面板可以查看、创建、删除对象之间的连接。要查看视图控制器的连接可以通过以下步骤在Xcode的界面中从左侧的文件组选中要查看的视图控制器的Xib文件在视图编辑界面点击选中 Files Owner在 Inspector 面板选中 Connection inspector这里会显示文件所有者所有的插座连接在视图编辑界面按住Control键点击 Files Owner 或者在 Files Owner上点击右键弹出一个黑色半透明的面板显示文件所有者的所有连接在上面第三步右侧面板显示的连接面板和右键点击Files Owner弹出的半透明连接面板显示的信息和作用都是一样的可以根据个人习惯灵活使用。到目前为止唯一的连接是视图控制器的 view 插座变量。一个插座变量就对应视图控制器类的一个属性有时候也可以是一个实例变量只不过这个属性和nib文件中的某个界面元素连接在一起。此处的view的连接表明当nib文件 RootViewController.xib 被加载并且UIView的实例解档之后视图控制器的view实例变量会被设置为指向nib文件中的视图。