【问题标题】:Loading Nib Programmatically以编程方式加载 Nib
【发布时间】:2012-10-09 19:45:14
【问题描述】:

我正在使用 Xcode 4.3.2。

我正在尝试以编程方式加载 Nib,而不是使用 Storyboard。 Storyboards 似乎要简单得多,但不幸的是它们与 iOS 4 不兼容,我正在构建一个需要向后兼容的应用程序。

这是我的问题:我正在尝试加载主视图 - 一个带有绿色背景的简单视图。目前没有默认视图。

我的文件是:

AppDelegate.h/.m GreenViewController.h/.m SwitchViewController.h/.m

我想在应用程序开始时加载绿屏,所以在 AppDelegate.m 我有:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil];

    //UIView *switchView = self.switchViewController.view;


    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
}

在 SwitchViewController.m 我有:

- (void)viewDidLoad
{
    self.greenViewController = [[GreenViewController alloc] initWithNibName:@"GreenView" bundle:nil];
    [self.view insertSubview:self.greenViewController.view atIndex:0];
    [super viewDidLoad];
}

用默认代码填写简单的initWithNibName。

在 GreenViewController.m 我有:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

这里是一切的主要功能。当我运行该应用程序时,我立即收到错误:

2012-10-09 12:34:35.586 MyViewSwitcher[5210:f803] -[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310
2012-10-09 12:34:35.587 MyViewSwitcher[5210:f803] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310'

有人可以帮我理解错误的原因吗?我确保 GreenView.xib 的“自定义类”是身份检查器中的“GreenViewController”。此外,我确保“视图”的引用出口是文件的所有者。我想在我的应用启动时加载 GreenView 笔尖。最终,我将通过添加一个按钮来切换视图,但到目前为止我什至无法加载主视图。我不确定我在误解什么。

提前感谢您的帮助!

【问题讨论】:

  • 你的switchViewController属性合成正确了吗?
  • 阿迪尔,这绝对是我的问题。我添加了“@synthesize switchViewController;” & 现在我的错误是:2012-10-09 13:48:27.970 MyViewSwitcher[5345:f803] 应用程序窗口应该在应用程序启动结束时有一个根视图控制器
  • 你能帮我解决这个问题吗?我想我走在正确的轨道上。

标签: objective-c ios xcode ios5 nib


【解决方案1】:

问题不在于加载笔尖。问题出在这一行:

self.switchViewController = [[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil];

这里您使用的是“点语法”,在The Objective-C Programming Language 中有说明。当您使用该语法设置属性时,编译器会将其转换为常规的 Objective-C 消息,如下所示:

[self setSwitchViewController:[[SwitchViewController alloc] initWithNibName:@"GreenView" bundle:nil]];

在运行时,系统告诉您您的AppDelegate 对象不理解setSwitchViewController: 方法。您需要使用@synthesize 指令(在The Objective-C Programming Language 中进行了说明)来告诉编译器为您实现setSwitchViewController: 方法:

@synthesize switchViewController = _switchViewController;

【讨论】:

  • 清洁和构建也有帮助。谢谢罗伯。
【解决方案2】:
 '-[AppDelegate setSwitchViewController:]: unrecognized selector sent to instance 0x6c6c310'

您正在向/在您的 AppDelegate 中发送消息(调用方法)setSwitchViewController:。这就是问题所在。

【讨论】:

  • 我如何调用 setSwitchViewController 方法?我没有定义它。我在某处隐含地称呼它吗?
【解决方案3】:
  1. 在使用makeKeyAndVisible之前,请确保您的UIWindow具有rootViewController

    [self.window setRootViewController:self.switchViewController]; [self.window makeKeyAndVisible];

  2. 确保按照上面的说明合成属性。

  3. 在子类中实现方法时,例如SwitchViewController.m,何时调用super 方法很重要。除非您有任何特殊意图,否则几乎总是调用 super 实现在本地 self 实现之前。所以,我建议你将SwitchViewController.m中的- (void)viewDidLoad更改为如下所示

    • (void)viewDidLoad { [超级viewDidLoad];

      self.greenViewController = [[GreenViewController alloc] initWithNibName:@"GreenView" bundle:nil];

      [self.view insertSubview:self.greenViewController.view atIndex:0]; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多