如何在Mavericks中打开NSSheet? [英] How do I open an NSSheet in Mavericks?

查看:180
本文介绍了如何在Mavericks中打开NSSheet?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在小牛,打开和关闭NSSheets的方法已经改变。为了使其更加严格,发行说明与当前文档不匹配(见下文)。



我试图这样做: p>

MainSheetController(NSWindowController):

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

SheetController(NSObject):


$ b b

 (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


解决方案

做这个。希望可以发布..



MainWindow.h

  @接口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;

MainWindow.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是可选的
}

// 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版本,控制器,控制仍然是本地的。


In Mavericks, the methods to open and close NSSheets has changed. And to make it tougher, the Release Notes do not match the current documentation (see below).

I'm trying to do this:

MainSheetController (NSWindowController):

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

SheetController (NSObject):

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

I get to 2, with no errors or warnings, but no sheet..

Current Documentation:

#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

解决方案

I figured out how to do this. Hope it's ok to post..

MainWindow.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;

MainWindow.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];
}

With this method, new in 10.9,I don't need a special sheet controller, and control remains quote local.

这篇关于如何在Mavericks中打开NSSheet?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆