代码之家  ›  专栏  ›  技术社区  ›  Brock Woolf

加载后指向nswindow xib的指针?

  •  5
  • Brock Woolf  · 技术社区  · 16 年前

    在下面的代码中,customwindow是nswindow的一个子类。

    CustomWindow *window = [[CustomWindow alloc] init];
    if (![NSBundle loadNibNamed:@"NibName" owner:window])
    [window center]; // doesn't work
    

    在加载xib之后,如何获得一个指针来控制它,以便执行诸如使nswindow居中之类的操作(我指的是xib中的序列化指针)?

    我在这里做错什么了?

    4 回复  |  直到 16 年前
        1
  •  16
  •   Rob Keniger    16 年前

    你应该使用 NSWindowController 子类。 NSWindow控制器 是专门为实现您想要的目标而设计的,它解决了如果您直接使用 NSBundle . 你通常应该使用 NSWindow控制器 子类来管理windows。

    创建的子类 NSWindow控制器 :

    @interface MyWindowController : NSWindowController {}
    @end
    
    @implementation MyWindowController
    - (id)init
    {
        self = [super initWithWindowNibName:@"MyWindow"];
        if(self)
        {
            //initialize stuff
        }
        return self;
    }
    //this is a simple override of -showWindow: to ensure the window is always centered
    -(IBAction)showWindow:(id)sender
    {
        [super showWindow:sender];
        [[self window] center];
    }
    @end
    

    在接口生成器中,设置 文件所有者 成为 MyWindowController 连接 window 出口 文件所有者 你笔尖上的窗口对象。

    然后,您可以执行以下操作来显示窗口:

    MyWindowController* controller = [[MyWindowController alloc] init];
    [controller showWindow:self];
    
        2
  •  2
  •   Peter Hosey    16 年前

    在下面的代码中,customwindow是nswindow的一个子类。

    CustomWindow *window = [[CustomWindow alloc] init];
    if (![NSBundle loadNibNamed:@"NibName" owner:window])
    [window center]; // doesn't work
    

    在加载xib之后,如何获得一个指针来控制它,以便执行诸如将nswindow居中到xib中之类的操作?

    将nswindow居中放在xib中是没有意义的(您可以将它居中) 在屏幕上 ),除非您的意思是将xib内的nswindow对象居中,在这种情况下,为什么要在xib外创建另一个nswindow(customwindow)对象?

    记住,nib(或xib)是对象的存档。如果要使用nib中的窗口,需要创建指向该窗口的出口,将文件所有者的类设置为添加出口的类,在ib中连接出口,并通过将出口传递给 owner: 争论。作为所有者,这个对象将负责处理窗口。它可能是(在我的代码中通常是)加载nib的同一个对象。

    也, init 不在nswindow上工作;必须使用 initWithContentRect:styleMask:backing:defer: initWithContentRect:styleMask:backing:defer:screen: . 使用 初始化 只有当你实现了 初始化 在customwindow中使用这两个选择器中的一个 [super init…] 消息。

        3
  •  1
  •   Carl Norum    16 年前

    你可能不想让你的窗口成为文件的所有者。通常你会通过 self 或者那里的某个控制器对象。那么如果 自己 或者那个控制器对象有一个customwindow IBOutlet ,当你打电话的时候它会被连接起来 loadNibNamed: . 退房 this post 例如代码。

        4
  •  0
  •   Adrian    16 年前

    xib是对象的容器,它不等于窗口。不能将xib居中,只能将包含在xib中的窗口居中。

    此外,xib中的对象是在加载时创建的。您不会将一个对象作为所有者传递,然后代表xib中的一个对象,而是使用iboutlets获取加载xib时创建的新对象的引用,然后可以与它们交互。

    文件的所有者对象是xibs中的一个特殊对象,因为它是唯一未创建的对象,您可以通过将其传递给 loadNibNamed:owner: . 它是您在xib创建的对象和应用程序之间的网关。

    通常,所有者对象是某种控制器类。在interface builder中将文件的owner类设置为controller类,然后在该类中定义一些iboutlet,它们将在interface builder中显示在文件的owner上,您可以将xib中的对象连接到它们。

    最后,当您将控制器对象传递给 loadnibnamed:所有者: ,cocoa会将您的iboutlet连接到新创建的对象,您可以使用它们与它们进行交互,例如在xib中居中放置一个窗口。