Objective c 窗口排序和XIB
我正在设置OSX开发的第一步,但遇到了一些问题。我有相当多的iOS开发经验,但OSX程序的窗口系统是另一回事 我正在为twitter这样的社交网络制作一个客户端,需要两个单独的窗口控制器来启动应用程序,一个用于显示时间线,另一个用于登录,如果尚未登录。在info.plist中,您需要给它一个main.xib。为此,我制作了一个空的xib,我会在应用程序启动时隐藏它。在国际海事组织,这不是一个好的解决方案,有什么更好的解决方案?我想将窗口与appdelegate分开,因为这样我可以将代码分开 这给了我一个问题,当我打开我的“第二个”窗口登录时,它会出现,但不是活动的。我已经尝试了所有的方法,比如,orderFront:,activateIgnoringOtherApps:,MakeKeyandDerfront:&更多。但这一切都不起作用 那么:首先,是否有更好的方法来处理info.plist中需要的main.xib,如果没有,是否有办法解决焦点问题? 我正在使用om osx 10.7的结构(您的第一个问题),我建议:Objective c 窗口排序和XIB,objective-c,xcode,macos,cocoa,Objective C,Xcode,Macos,Cocoa,我正在设置OSX开发的第一步,但遇到了一些问题。我有相当多的iOS开发经验,但OSX程序的窗口系统是另一回事 我正在为twitter这样的社交网络制作一个客户端,需要两个单独的窗口控制器来启动应用程序,一个用于显示时间线,另一个用于登录,如果尚未登录。在info.plist中,您需要给它一个main.xib。为此,我制作了一个空的xib,我会在应用程序启动时隐藏它。在国际海事组织,这不是一个好的解决方案,有什么更好的解决方案?我想将窗口与appdelegate分开,因为这样我可以将代码分开 这给
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离开窗口。起初我以为窗口大小会有问题,但经过一次清理后,它解决了这个问题。谢谢!