1

我已经尝试了在这个网站上找到的许多可能性,并从苹果开发者页面上阅读了一些解释,但似乎我无法解决关于使用/表单 NIB 加载 NSViewController 的问题。

Xcode Project 上的文件看起来有点像这样:

  • SecondViewController.h
  • 第二视图控制器.m
  • SecondViewController.xib
  • AppDelegate.h
  • AppDelegate.m
  • 主菜单.xib

主要问题是如何使用 SecondViewController.xib 上的初始笔尖以编程方式创建 SecondViewController

  • MainMenu.xib 上 FileOwner 的自定义类是 NSApplication
  • SecondViewController.xib 上 FileOwner 的自定义类是 SecondViewController
  • MainMenu.xb 中有一些面板和窗口(关于窗口和首选项面板)
  • 此应用程序没有主窗口(使用状态栏上的通知图标)

SecondViewController.h

@interface SecondViewController : NSViewController {
    BOOL fullScreenMode;
    NSImageView *fullScreenbg;
    NSImageView *imageView1;
    NSImageView *imageView2;
    NSPanel *imageWindow;

}


@property (assign) IBOutlet NSImageView *fullScreenbg;
@property (assign) IBOutlet NSImageView *imageView1;
@property (assign) IBOutlet NSImageView *imageView2;
@property (assign) IBOutlet NSPanel *imageWindow;

第二视图控制器.m

@implementation SecondViewController {
    NSImageView *nv1;
    NSImageView *nv2;
    NSSize curImgSize;
}

@synthesize fullScreenbg;
@synthesize imageView1;
@synthesize imageView2;
@synthesize imageWindow;

......

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
        fullScreenMode = YES;
    }

    return self;
}

AppDelegate.h

@interface AppDelegate : NSObject <NSApplicationDelegate,NSWindowDelegate> {
   NSPanel *aboutWindow;
   IBOutlet NSMenu *myStatusMenu;
   IBOutlet NSMenuItem *toggleFullScreen;
}

AppDelegate.m

@implementation AppDelegate {
    SecondViewController *controller;
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    controller = [[SecondViewController alloc] 
                 initWithNibName:@"SecondViewController" 
                 bundle:nil];  
    //Not work (fullscreenbg, imageView1, imageView2,imageWindow = nil)

    //controller = [[SecondViewController alloc] init]; ?? <-- didn't work either
}

即使使用 initWithNibName 或仅使用 init,调试时所有 IBOutlet 属性似乎都为零。

我已经尝试过其他解决方案,例如“NSBundle loadNibNamed”或使用 loadView,但它不起作用(警告消息:“NSObject 我不响应 loadView”)。

secondViewController 的主要目的是显示通知消息,包括图形和 web 元素。

我希望有人能给我一个最好的建议。谢谢。

4

2 回答 2

0

这是正常行为。IBOutlets 在构造函数中没有连接。

您可以覆盖 viewDidLoad,调用 super,然后进行任何初始化。

于 2012-09-16T20:43:36.310 回答
-1
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    //added this line :
    if (nibBundleOrNil!=nil || ![nibBundleOrNil isEqualtoString:@""]) {
        [NSBundle loadNibNamed:@"SecondViewController" owner:self];
    {

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Initialization code here.
        fullScreenMode = YES;
    }

    return self;
}
于 2012-09-15T14:24:22.747 回答