【发布时间】:2011-10-23 16:28:17
【问题描述】:
如何防止 UIVIewController 加载 xib?
我在线下载了一个 XCode (iPhone) 项目,我想停止加载 xib 文件。视图确实加载方法中没有任何处理 xib 的代码。如何强制 UIViewController 从它的 viewDidLoad 方法而不是 xib 加载?
【问题讨论】:
标签: iphone xcode ipad uiviewcontroller
如何防止 UIVIewController 加载 xib?
我在线下载了一个 XCode (iPhone) 项目,我想停止加载 xib 文件。视图确实加载方法中没有任何处理 xib 的代码。如何强制 UIViewController 从它的 viewDidLoad 方法而不是 xib 加载?
【问题讨论】:
标签: iphone xcode ipad uiviewcontroller
覆盖 loadview 但不要调用 [super loadview]。示例:
-(void)loadView{
self.view = [UIView new];
[self.view setBackgroundColor:[UIColor redColor]];
}
来自文档
创建控制器管理的视图。
你不应该调用这个方法 直接地。视图控制器在视图属性时调用此方法 已请求但当前为零。如果您手动创建视图, 您必须重写此方法并使用它来创建您的视图。如果你 使用 Interface Builder 创建视图并初始化视图 控制器——也就是说,您使用 initWithNibName:bundle: 方法,设置 nibName 和 nibBundle 直接创建属性,或者同时创建视图和视图控制器 Interface Builder——那么你不能重写这个方法。
此方法的默认实现会寻找有效的 nib 信息并使用该信息加载相关的 nib 文件。 如果没有指定 nib 信息,默认实现会创建 一个普通的 UIView 对象,并使其成为主视图。
如果您重写此方法以手动创建视图, 您应该这样做并将层次结构的根视图分配给 查看属性。 (您创建的视图应该是唯一的实例,并且 不应与任何其他视图控制器对象共享。)您的 此方法的自定义实现不应调用 super。
如果您想对视图执行任何其他初始化,请执行 所以在 viewDidLoad 方法中。在 iOS 3.0 及更高版本中,您还应该 覆盖 viewDidUnload 方法以释放对 查看或其内容。
【讨论】:
编写你自己的初始化方法。稍后如果您需要 nib,您可以创建一个 UINib 对象,当您需要视图时,您可以使用 instantiateWithOwner。
在创建视图控制器时使用init 将阻止笔尖加载。另一件事是为 nib 命名,而不是视图控制器的名称——因为如果它们匹配,则可以自动加载 nib。我使用 ViewControllerName_iPad 或 ViewControllerName_iPhone 并根据设备习惯创建所需的视图。
【讨论】:
要从 xib 文件加载的代码不在视图控制器本身的 viewDidLoad 方法中。
您通常应该在应用程序委托的 didFinishLaunchingWithOptions: 方法或 info.plist 文件中的 NSMainNibFile 条目下找到它。
【讨论】:
尝试将 initWithNibNameOrNil 方法更改为 init。
如果这不起作用,还可以通过取消注释并在那里设置您的视图来覆盖 loadView 方法。
这是一个例子:
- (id)init
{
self = [super init];
if (self) {
// Custom initialization
}
return self;
}
- (void)loadView {
[super loadView];
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(0,0,320,460)];
myView.backgroundColor = [UIColor redColor];
self.view = myView;
[myView release];
}
【讨论】:
[super loadView],那么它仍然会加载NIB。 [super init] 只是调用 [self initWithNibName:nil bundle:nil]。作为传递此 nil NIB 名称的结果,loadView 的默认实现将加载找到的任何具有与视图控制器名称匹配的基本名称的 NIB。因此,在这种情况下,不需要覆盖 init。只需删除[super loadView] 即可。
也许我在这里叫错了树,但是 UIViewController 从 XIB 加载其视图是因为加载 UIViewController 本身的 XIB 在视图控制器的设置中设置了“NIB 名称”吗?
例如加载 MainWindow.xib,查看您的视图控制器。选择它,然后查看右侧的视图控制器设置(第 4 个选项卡)。其中一项设置是“NIB 名称”。只需将其设为空白即可停止视图控制器从该 XIB/NIB 加载其视图。
【讨论】: