Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 窗口排序和XIB_Objective C_Xcode_Macos_Cocoa - Fatal编程技术网

Objective c 窗口排序和XIB

Objective c 窗口排序和XIB,objective-c,xcode,macos,cocoa,Objective C,Xcode,Macos,Cocoa,我正在设置OSX开发的第一步,但遇到了一些问题。我有相当多的iOS开发经验,但OSX程序的窗口系统是另一回事 我正在为twitter这样的社交网络制作一个客户端,需要两个单独的窗口控制器来启动应用程序,一个用于显示时间线,另一个用于登录,如果尚未登录。在info.plist中,您需要给它一个main.xib。为此,我制作了一个空的xib,我会在应用程序启动时隐藏它。在国际海事组织,这不是一个好的解决方案,有什么更好的解决方案?我想将窗口与appdelegate分开,因为这样我可以将代码分开 这给

我正在设置OSX开发的第一步,但遇到了一些问题。我有相当多的iOS开发经验,但OSX程序的窗口系统是另一回事

我正在为twitter这样的社交网络制作一个客户端,需要两个单独的窗口控制器来启动应用程序,一个用于显示时间线,另一个用于登录,如果尚未登录。在info.plist中,您需要给它一个main.xib。为此,我制作了一个空的xib,我会在应用程序启动时隐藏它。在国际海事组织,这不是一个好的解决方案,有什么更好的解决方案?我想将窗口与appdelegate分开,因为这样我可以将代码分开

这给了我一个问题,当我打开我的“第二个”窗口登录时,它会出现,但不是活动的。我已经尝试了所有的方法,比如,orderFront:,activateIgnoringOtherApps:,MakeKeyandDerfront:&更多。但这一切都不起作用

那么:首先,是否有更好的方法来处理info.plist中需要的main.xib,如果没有,是否有办法解决焦点问题? 我正在使用om osx 10.7的结构(您的第一个问题),我建议:

  • 创建一个包含一个空白窗口和一个大NSView(称为megaView)的XIB。在AppDelegate中为您的大NSView创建一个IBOutlet。将应用程序设置为在加载时使用此XIB
  • 创建两个单独的NSView XIB:一个用于登录状态,一个用于注销状态。把你的布局放在这些里面
  • 创建两个NSViewController子类:一个控制刚刚创建的每个NSView的逻辑。让我们将它们称为LoggedOutViewControllerLoggedInViewController
  • 跳回您创建的两个NSView。将登录NSView的文件所有者设置为LoggedInViewController,将注销NSView的文件所有者设置为LoggedOutViewController。将每个文件所有者的视图(右键单击文件所有者以找到它)连接到相应的NSView
  • 在应用程序代理中,以您需要的任何方式确定用户的身份验证状态
  • 如果已登录,请执行以下操作:

    NSViewController *loggedInController = [[NSViewController alloc] initWithNibName:@"NibNameGoesHere" bundle:nil];
    [[self megaView] addSubview:[loggedInController view]];
    
    否则,请使用loggedOutController执行上述过程:

    NSViewController *loggedOutController = [[NSViewController alloc] initWithNibName:@"OtherNibNameGoesHere" bundle:nil];
    [[self megaView] addSubview:[loggedOutController view]];
    

    这会让你得到你想要的,并且可能会澄清你在这个过程中的第二个问题。我的答案和内特的不同之处在于,我的答案使用同一个窗口。有条件地实例化视图控制器并将其视图加载到SuperView中可能是我学到的Cocoa最重要的方面。

    不止一次,你真的应该将你的应用程序代理与你的窗口控制器分开。继续,从模板创建一个新的Cocoa应用程序。在
    main menu.xib
    中,删除该窗口。在
    AppDelegate.h
    中,将
    IBOutlet
    删除到
    NSWindow
    。创建
    NSWindowController
    的两个新子类,并使用
    XIB
    s完成--可能是
    LoginWindowController
    TimelineWindowController

    对于“final”
    NSWindowController
    子类(即那些不会被子类化的子类),指定初始值设定者的最佳实践是

    //for our example class LoginWindowController
    - (id)init
    {
        self = [super initWithWindowNibName:@"LoginWindowController"];
        if (self) {
            //....
        }
        return self;
    }
    
    现在,在应用程序代理中,您应该具有两个不同窗口控制器实例的
    @properties

    //Within AppDelegate.m
    
    #import "AppDelegate.h"
    #import "LoginWindowController.h"
    #import "TimelineWindowController.h"
    
    @interface AppDelegate ()
    @property (nonatomic) LoginWindowController *loginWindowController;
    @property (nonatomic) TimelineWindowController *timelineWindowController;
    //For the sake of this demo, add a property for the loggedIn state:
    @property (nonatomic) BOOL loggedIn;
    @end
    
    你的应用程序委托中应该有某种方法来表示正确的窗口控制器。我们称之为
    -updateWindowVisibility

    - (void)updateWindowVisibility
    {
        BOOL isLoggedIn = self.loggedIn;
    
        BOOL loginWindowVisible = self.loginWindowController.window.isVisible;
        BOOL showLoginWindow = !isLoggedIn;
    
        BOOL timelineWindowVisible = self.timelineWindowController.window.isVisible;
        BOOL showTimelineWindow = isLoggedIn;
    
        if (!loginWindowVisible && showLoginWindow) {
            if (!self.loginWindowController) self.loginWindowController = [[LoginWindowController alloc] init];
            [self.loginWindowController showWindow:nil];
        } else if (loginWindowVisible && !showLoginWindow) {
            [self.loginWindowController close];
            self.loginWindowController = nil;
        }
    
        if (!timelineWindowVisible && showTimelineWindow) {
            if (!self.timelineWindowController) self.timelineWindowController = [[TimelineWindowController alloc] init];
            [self.timelineWindowController showWindow:nil];
        } else if (timelineWindowVisible && !showTimelineWindow) {
            [self.timelineWindowController close];
            self.timelineWindowController = nil;
        }
    }
    
    上述实现的方法所做的工作比当前设置所需的工作稍多,但在需要显示/隐藏其他窗口时,应该更易于修改。此时只需从
    -applicationdFinishLaunching:
    调用
    -updateWindowVisibility

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification
    {
        self.isLoggedIn = NO;
        [self updateWindowVisibility];
    }
    

    我发布了一个演示这种方法的帖子。

    哇,老兄,你太棒了!这很好用。没有想过从main.xib离开窗口。起初我以为窗口大小会有问题,但经过一次清理后,它解决了这个问题。谢谢!