gpt4 book ai didi

objective-c - showWindow 但等待窗口加载?

转载 作者:行者123 更新时间:2023-12-03 17:52:04 26 4
gpt4 key购买 nike

我有两个 .xib 文件,MainMenu 和 PreferenceMenu。我将 PreferenceMenu 的文件所有者设置为 NSWindowController 的子类,这样我就可以修改窗口的打开方式、修改方式等。

通常我通过 IB 打开 PreferenceMenu,发送 showWindow:对首选项 Controller 对象的操作。这一切工作正常, window 打开得很好。我还实现了NSTabViewNSToolBar在我的 PreferenceMenu 中,因为不同的选项卡包含不同的首选项。

无论如何,我现在必须提示用户是否要在首次加载应用程序后打开 PreferenceMenu。我的流程是检查是否有 NSUserDefaults键已设置,然后提示并设置该键(如果未设置)。如果返回NSAlert按钮是一个特定的按钮,然后我打开 PreferenceMenu 并切换到正确的选项卡。

这个过程的要点是:

  1. 导入CCPreferencesController.hCCAppDelegate.h
  2. 创建 strong引用CCPreferencesController窗口(用于 ARC)
  3. 提示 NSAlert ,如果返回的按钮正确,则运行以下命令:

    self.windowController = [[CCPreferencesController alloc] initWithWindowNibName:@"PreferenceMenu"];
    [self.windowController showWindow:self];
  4. 导入CCAppDelegate.hCCPreferencesController.m

  5. 处理NSAlert回复 CCPreferencesController.m :

    - (void)showWindow:(id)sender{
    if ([CCAppDelegate class] == [sender class]){
    [self openLogin];
    }
    [super showWindow:sender];
    }
  6. 切换 TabViewopenLogin方法。

这种多一点的效果很好,除了showWindow在窗口内容实际加载之前调用。这意味着调用 self.toolbar , self.tabView等返回 NULL 。我的解决方案是简单地使用计时器来等待元素加载,但这一点也不优雅。

因此,我的问题是如何避免使用延迟,而是使用我的 openLogin方法在 showWindow 上被调用但要等待窗口内容加载吗?

我也 99% 确信我的代码很糟糕,包括我如何导入 .h 文件和子类化文件所有者,因此非常感谢任何改进这一点的提示。

<小时/>

对于那些想更详细地查看代码的人,这里是相关部分

CCAppDelegate.h:

#import <Cocoa/Cocoa.h>
#import "CCPreferencesController.h"

@class WebView;

@interface CCAppDelegate : NSObject <NSApplicationDelegate, NSUserNotificationCenterDelegate, NSSharingServiceDelegate>

@property (strong) CCPreferencesController *windowController;
...

@end

CCAppDelegate.m:

- (void)webView:(WebView *)sender didFinishLoadForFrame:(WebFrame *)frame{
bool loginPrompted = [[NSUserDefaults standardUserDefaults] boolForKey:@"loginPrompted"];
if (!loginPrompted){
NSAlert *alert = [NSAlert alertWithMessageText:@"Login"
defaultButton:@"Login"
alternateButton:@"Cancel"
otherButton:nil
informativeTextWithFormat:@"Would you like to login to enable voting?"];
// Display alert
[alert beginSheetModalForWindow:self.window completionHandler:^(NSModalResponse returnCode) {
// Return focus to window
[[alert window] orderOut:self];
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
[prefs setBool:YES forKey:@"loginPrompted"];
[prefs synchronize];
if (returnCode == 1){
self.windowController = [[CCPreferencesController alloc] initWithWindowNibName:@"PreferenceMenu"];
[self.windowController showWindow:self];
}
}];

}

}

CCPreferencesController.h:

#import <Cocoa/Cocoa.h>

@interface CCPreferencesController : NSWindowController {}

...

@end

CCPreferencesController.m

#import "CCPreferencesController.h"
#import "CCAppDelegate.h"

@implementation CCPreferencesController

- (id)init{
if(self = [super initWithWindowNibName:@"PreferenceMenu"]) {}
return self;
}

- (void)awakeFromNib{
...
[self.toolbar setSelectedItemIdentifier:@"general"];
}

- (void)showWindow:(id)sender{
if ([CCAppDelegate class] == [sender class]){
[self openLogin];
}
[super showWindow:sender];
}

// This is gross
- (void)openLogin{
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, NSEC_PER_SEC * 0.1);
dispatch_after(delay, dispatch_get_main_queue(), ^(void){
[self.toolbar setSelectedItemIdentifier:@"tab"];
[self.tabView selectTabViewItemAtIndex:1];
NSRect frame = [self.window frame];
frame.size.height += 55;
frame.origin.y -= 55;
[self.window setFrame:frame display:YES animate:YES];
});

}

最佳答案

不会走这条路,但也许它适合您的情况,因为您是 block 国王,但在调用 showWindow 之前您可以强制加载窗口。只需在调用 super showWindow 之前调用 self.window

注意,调用 getter 来实现副作用也远非干净!

最好将需要窗口的代码移到类似 windowDidLoad 之类的地方

也许

@implementation MyWindowController {
NSDictionary *_options;
}

- (void)showWindow:(id)sender{
if ([CCAppDelegate class] == [sender class]){
_options = @{@"Login": @YES};
} else {
_options = nil;
}

if(self.isWindowLoaded) {
[self applyOptions];
}
[super showWindow:sender];
}

- (void)windowDidLoad {
[self applyOptions];
}

- (void)applyOptions {
if([_options[@"Login"] boolValue]) {
//if logged in ... blablabla
}
}

关于objective-c - showWindow 但等待窗口加载?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23724143/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com