用 XIB 替换情节提要
Posted
技术标签:
【中文标题】用 XIB 替换情节提要【英文标题】:Replacing storyboard with XIB 【发布时间】:2012-04-08 12:16:10 【问题描述】:如何?
在尝试创建动态视图及其控制器时,我失去了新故事板的所有优势。现在,当试图从项目中删除它时,我创建了一个带有自己的控制器的新 XIB 并在项目设置中替换它: 现在,当尝试运行应用程序时,它会崩溃,并且日志会显示以下内容:
2012-04-08 14:50:16.567 Bazaart[11340:15203] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<UIApplication 0x8c15c20> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key view.'
这里是UIRootWindow的代码:
#import <UIKit/UIKit.h>
@interface UIRootWindow : UIViewController
@end
及其对应的实现:
#import "UIRootWindow.h"
@implementation UIRootWindow
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
return self;
- (void)viewDidLoad
[super viewDidLoad];
- (void)viewDidUnload
[super viewDidUnload];
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
return YES;
@end
编辑: 我有 Phillip 建议的窗口(见下文)。但是……我的做法似乎不是最好的。我做得对吗?
UIRootWindow *wnd = [[UIRootWindow alloc] init];
[wnd view];
[self setWindow:wnd.window];
【问题讨论】:
附注一下,为了将来的兼容性,您不应以UI
或NS
开头自己的类名(想象一下,在SDK 的未来版本中,Apple 引入了一个名为UIRootWindow
)。使用你自己的前缀,这样你就会有URKRootWindow
这样的东西。
【参考方案1】:
不要在主界面字段中添加任何内容。相反,在应用程序委托的 didFinishLaunchingWithOptions: 方法中加载您的***控制器并在那里设置窗口的根控制器。
应用程序启动假定那里提到的 xib 有一个文件所有者,它是一个 UIApplication。 (旧的模板曾经这样做,一些示例项目仍然这样做。)
【讨论】:
谢谢。它确实奏效了。虽然,我附加窗口的方式似乎不是最佳的。有没有更好的方法来做到这一点? 我建议使用单视图控制器模板(没有情节提要)创建一个全新的测试应用程序,并查看他们如何在应用程序委托中进行设置。基本上,您希望将您的第一个控制器(或其包含的控制器,如果有的话)分配给委托的window.rootViewController
。
谢谢。这肯定回答了我的问题。应该自己考虑一下。【参考方案2】:
当您的应用启动时,XIB 中的每个控制器都是根据您设置的类的名称创建的。然后,您以可视方式连接的每个属性都是使用 KVC 设置的。该错误告诉您,在此过程中的某个地方,“view”属性不正确。
我能想到这可能发生的两个原因:
您没有为您的 ViewController 或 XIB 中的其他对象设置正确的类(在“身份检查器”中) 您没有正确接线连接。 (在“连接检查器”中)无论哪种方式,您都可以快速浏览您的 XIB 中的设置,注意属性“视图”的连接位置。
【讨论】:
以上是关于用 XIB 替换情节提要的主要内容,如果未能解决你的问题,请参考以下文章