3

在 Mavericks 中,打开和关闭 NSSheets 的方法发生了变化。为了使它更难,发行说明与当前文档不匹配(见下文)。

我正在尝试这样做:

MainSheetController(NSWindowController):

-(IBAction)callSheet:(id)sender {
    [sheetController openSheet];
}

表控制器(NSObject):

 (void)openSheet {  
    [[NSBundle mainBundle] loadNibNamed:sheetName owner:self topLevelObjects:nil];
    NSLog(@"1");
    [self.mainWindowController.window beginSheet:self.sheet completionHandler:nil];
    NSLog(@"2");    
}

我到了 2,没有错误或警告,但没有工作表..

当前文档:

#if NS_BLOCKS_AVAILABLE
- (void)beginSheet:(NSWindow *)sheetWindow completionHandler:(void (^)(NSModalResponse returnCode))handler NS_AVAILABLE_MAC(10_9);
- (void)beginCriticalSheet:(NSWindow *)sheetWindow completionHandler:(void (^)(NSModalResponse returnCode))handler NS_AVAILABLE_MAC(10_9);
#endif
4

3 回答 3

11
- (IBAction)userButtonPressed:(id)sender {

    UserLoginWindowController * wc = [UserLoginWindowController new];
    // we keep a reference, so the WC doesn't deallocate
    self.modalWindowController = wc;

    [[self window] beginSheet:[wc window] completionHandler:^(NSModalResponse returnCode) {
        self.modalWindowController = nil;
    }];

}

在用户登录窗口控制器中

- (IBAction)cancelButtonPressed:(id)sender {

    [[[self window] sheetParent] endSheet:[self window] returnCode:NSModalResponseCancel];

}
于 2014-09-16T13:48:42.367 回答
5
- (IBAction)showSheet:(id)sender
{
    if (_windowController == nil)
    {
        _windowController = [MyWindowController new];
    }

    [[self window] beginSheet:[_windowController window] completionHandler:^(NSModalResponse returnCode)
    {
    }];
}

// And inside your MyWindowController class:

- (id)init
{
    self = [super initWithWindowNibName:@"MyWindowNibName"]; // TODO: Change the name of your NIB
    return self;
}

在您的 nib 文件中,确保未选中窗口的“启动时可见”标志。

于 2013-11-29T11:16:25.863 回答
1

我想出了如何做到这一点。希望可以发帖。。

主窗口.h

@interface MainWindowController : NSWindowController {
    NSString *sheetName;
    IBOutlet NSWindow *sheet;
    id result1;
    id result2;
    ...
    id resultn;
}

@property (strong) NSString *sheetName;
@property (strong, nonatomic) IBOutlet NSWindow *sheet;

-(IBAction)callSheet0:(id)sender;
-(IBAction)callSheet1:(id)sender;
-(IBAction)callSheetn:(id)sender;

- (void)openSheet;
- (IBAction)save:(id)sender;
- (IBAction)cancel:(id)sender;

主窗口.m

- (void)windowDidLoad
{
    NSLog(@"%s", __FUNCTION__);
    [super windowDidLoad];
    sheetName = [[NSString alloc] init];
}


-(IBAction)callSheet0:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    sheetName = @"Sheet0";
    [self openSheet];
}
....

-(IBAction)callSheetn:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    sheetName = @"Sheetn";
    [self openSheet];


- (void)openSheet {
    NSLog(@"%s", __FUNCTION__);
    NSLog(@"sheetName: %@",sheetName );
    [[NSBundle mainBundle] loadNibNamed:sheetName owner:self topLevelObjects:nil];
    [self.window beginSheet:self.sheet completionHandler:nil];

}

- (void)save:(NSButton*)sender {

    switch ([sender tag]) {
        case 0:
            [self doSave1];
            result = @"1";
            break;

        case 1:
            [self doSave2];
            result = @"2";
            break;

        case n:
            [self doSaven];
            result = @"x";
            break;
    }
    [self endSheet:self.sheet returnCode:result];
}


- (IBAction)cancel:(id)sender {
    NSLog(@"%s", __FUNCTION__);
    result = @"0";
    [self endSheet:self.sheet returnCode:result];
    // returnCode is optional
}

//endSheet:(NSWindow *)sheetWindow  {
- (void)endSheet:(NSWindow *)sheetWindow returnCode:returnCode {
    //NSLog(@"%s", __FUNCTION__);
    [sheetWindow orderOut:self];

}

- (void)save:(NSButton*)sender {

    switch ([sender tag]) {
        case 0:
            [self doSave1];
            result = @"1";
            break;

            case n:
            [self doSave3];
            result = @"3";
            break;
    }
    [self endSheet:self.sheet returnCode:result];
}

使用 10.9 中新增的这种方法,我不需要特殊的工作表控制器,并且控制保持在本地引用。

于 2013-10-27T02:44:04.770 回答