Доступ к главному окну из класса NSDocument - PullRequest
0 голосов
/ 08 января 2012

У меня есть класс NSDocument, где мне нужно получить доступ к окну главного меню, которое открывается при запуске приложения.Когда я работаю в этом окне из приложения, кажется, что все работает, но при попытке выполнить те же операции из readFromFileWrapper:ofType:error: окно, к которому я обращаюсь, кажется нулевым.Почему это происходит?

РЕДАКТИРОВАТЬ: некоторый код, который имеет дело с этим:

- (BOOL)readFromFileWrapper:(NSFileWrapper *)fileWrapper ofType:(NSString *)typeName error:(NSError **)outError
{
    if([[NSFileManager alloc] fileExistsAtPath:[NSString stringWithFormat:@"%@/Project.plist",[[self fileURL] path]]]) {
        NSLog(@"%@", [[self fileURL] path]);

        NSDictionary *project = [NSDictionary dictionaryWithContentsOfFile:[NSString stringWithFormat:@"%@/Project.plist",[[self fileURL] path]]];

        if([[project objectForKey:@"type"] isEqualToString:@"vote"]) {

            [self openProject:[[self fileURL] path] type:@"vote"];

            return YES;

        } else if([[project objectForKey:@"type"] isEqualToString:@"quiz"]) {

            [self openProject:[[self fileURL] path] type:@"quiz"];

            return YES; 

        } else {
            return NO;
        }
    } else {
        return NO;
    }
}

Это мой readFromFileWrapper:ofType:error: метод.Вот мой openProject:type: метод:

-(void)openProject:(NSString *)filepath type:(NSString *)type 
{
    NSLog(@"Opening project @ %@",filepath);
    NSLog(@"%@", [MainWindow description]);
    [projectDesignerView setFrame:[[[[MainWindow contentView] subviews] objectAtIndex:0] frame]];
    [projectDesignerToolbar setFrame:[MainWindow frame] display:FALSE];
    [[MainWindow contentView] replaceSubview:[[[MainWindow contentView] subviews]objectAtIndex:0] with:projectDesignerView];
    [[projectDesignerToolbar toolbar] setShowsBaselineSeparator:YES];
    [MainWindow setToolbar:[projectDesignerToolbar toolbar]];
    [MainWindow setRepresentedFilename:filepath];
    [MainWindow setTitle:[NSString stringWithFormat:@"%@ - %@", [[filepath lastPathComponent] stringByDeletingPathExtension], [projectDesignerToolbar title]]];
    NSString *path = [[NSBundle mainBundle] pathForResource:@"projectDesigner" ofType:@"html"];
    NSURL *url = [NSURL fileURLWithPath:path];
    [[projectDesignerWebview mainFrame] loadRequest:[NSURLRequest requestWithURL:url]];
}

NSLog(@"%@", [MainWindow description]); возвращает ноль, когда MainWindow должно быть главным окном приложения.Я думаю, что проблема в том, что двойной щелчок по файлу перераспределяет все и, следовательно, дает сбой.

Ответы [ 2 ]

6 голосов
/ 09 января 2012

Не совсем понятно, о чем вы спрашиваете. Вы упоминаете, что MainWindow является торговой точкой в ​​MainMenu.xib, но вы не указываете, какой класс определяет торговую точку.

Если это окно предназначено для одного главного окна "проекта", то вы должны назначить свойство outlet в делегате приложения.

Затем вы можете получить доступ к этому из других классов, используя что-то вроде [(YourAppDelegate*)[NSApp delegate] mainWindow];.

Если, однако, вы пытаетесь получить ссылку на окно текущего документа, то это немного сложнее.

Причина, по которой NSDocument по умолчанию не имеет выхода window, заключается в том, что он предназначен для работы с экземплярами NSWindowController, которые сами управляют различными окнами, связанными с документом. Это означает, что документ может иметь несколько окон, показывающих разные виды одних и тех же данных, дополнительные палитры, связанные с документом, и так далее. Каждый экземпляр NSWindowController будет иметь свой собственный файл кончика окна и выход window.

По умолчанию NSDocument создает для вас один экземпляр NSWindowController, если вы специально не создаете и не назначаете экземпляры NSWindowController для документа. Это автоматически, вам даже не нужно знать, что контроллер окна существует.

Это означает, что если вы не управляете окнами документов с помощью NSWindowController экземпляров самостоятельно, вы можете прикрепить окно к NSWindowController, которое автоматически создается с помощью NSDocument, следующим образом:

/* Only implement this in an NSDocument instance where the 
   automatic window controller is being used.
   If the document has multiple window controllers, you must
   keep track of the main window controller yourself
   and return its window
*/
- (NSWindow*)documentWindow
{
    if([[self windowControllers] count] == 1)
    {
        return [[[self windowControllers] firstObject] window]; 
    }
    return nil;
}
2 голосов
/ 08 января 2012

Обычный способ справиться с этим - добавить IBOutlet в ваш подкласс NSDocument, а затем подключить его к окну документа в файле .xib.

В вашем .h:

@interface MyDocument : NSDocument

@property (nonatomic, assign) IBOutlet NSWindow *docWindow;

@end

В вашем .m:

@implementation MyDocument : NSDocument

@synthesize docWindow;

@end

Затем, самая важная часть, откройте MyDocument.xib (или как там его называют) и перетащите соединение из Владельца файла (предполагая, что это ваш подкласс NSDocument,по умолчанию) к основному окну документа и подключите его к выходу docWindow.

...