Cocoa:使用 nib 加载 NSViewController

Posted

技术标签:

【中文标题】Cocoa:使用 nib 加载 NSViewController【英文标题】:Cocoa : Load NSViewController with nib 【发布时间】:2012-09-15 12:26:14 【问题描述】:

我尝试了很多我在这个网站上找到的可能性并阅读了一些解释 来自苹果开发者页面,但似乎我无法解决我的问题 使用/形成 NIB 加载 NSViewController。

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

SecondViewController.h SecondViewController.m SecondViewController.xib AppDelegate.h AppDelegate.m MainMenu.xib

主要问题是我如何以编程方式创建 SecondViewController SecondViewController.xib 上的初始 nib

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;

SecondViewController.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 属性似乎都是 nil 正在调试中。

我尝试过其他解决方案,例如“NSBundle loadNibNamed”或using loadView,但没有成功(警告消息:“NSObject 我不响应 loadView”)。

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

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

【问题讨论】:

在你的 NSViewController 初始化期间设置一个断点,看看你是否真的在初始化它。 当然。执行 appdelegate 的初始化,执行第二个控制器的 initwithnibname,控制器不是 nil/null,但所有控制器出口都是 nil/null。 只有网点?你是手动设置插座吗?如果是,请尝试将它们设置为 awakeFromNib。 我知道了,添加 [NSBundle loadNibNamed:@"SecondViewController" owner:self];在 [super initWithNibName .......] 行之前 【参考方案1】:

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

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

【讨论】:

【参考方案2】:
- (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;

【讨论】:

您可以将自己的答案标记为正确答案,这也会给您 15 个代表。

以上是关于Cocoa:使用 nib 加载 NSViewController的主要内容,如果未能解决你的问题,请参考以下文章

nib 本地化时 Cocoa 无法加载窗口 nib 文件

从情节提要加载的 nib 的 Cocoa replaceSubview

从 Cocoa 中的其他 nib(即 Interface Builder)加载 nib

Cocoa 加载 ViewNib

Cocoa - 从 nib 加载视图并将其显示在 NSView 容器中,作为子视图

Xcode 5 Cocoa 应用程序无法在 OS X 10.6 上加载 Nib