InitWithWindowNibName не устанавливает поле окна - PullRequest
3 голосов
/ 02 апреля 2012

Я пытаюсь, чтобы следующий код работал.Он делает то, что ожидалось в первый раз, открывает окно и делает его передним окном, но когда оно вызывается в последующие времена, orderFront: не работает, потому что окно равно нулю.Почему initWithWindowNibName: не устанавливает поле окна объекта NSWindowController, возвращаемого из initWithNibName:?

//
//  CustomerCard.m
//  POSWonder
//
//  Created by kaydell on 2/26/12.
//  Copyright 2012 Kaydell Leavitt. All rights reserved.
//

#import "CustomerCard.h"

@implementation CustomerCard

// declare customerCard as a static variable
static CustomerCard* customerCard;

+(void) show {

    // if the customer card isn't instantiated, then instantiate it
    if (customerCard == nil) {
        customerCard = [[CustomerCard alloc] initWithWindowNibName:@"CustomerCard"];
        if (!customerCard.window) {
            NSLog(@"Why is window nil here?"); // <<<<<<<<<<< This line gets called <<<<<
        }
    }

    // show the customer card and make it the front window
    [customerCard showWindow:self];
    [customerCard.window orderFront:self]; // <<<<<<<< This line doesn't seem to do anything

}

-(void) dealloc {
    customerCard = nil;
    [super dealloc];
}

@end

Ответы [ 2 ]

2 голосов
/ 02 апреля 2012

В Интерфейсном Разработчике вам необходимо снять флажок с надписью «Выпуск при закрытии». Если этот флажок включен, окно будет освобождено и, вероятно, будет освобождено после его закрытия.

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

0 голосов
/ 30 июля 2013

Я знаю, что это старый вопрос, но я все равно хотел ответить на свой вопрос.

  • Я думаю, что использование статических переменных и синглтона для карты клиента не очень хорошая идея.

    // объявляем customerCard как статическую переменную
    статическая CustomerCard * customerCard;

Теперь мне кажется, что всякий раз, когда вы используете статические переменные, вы побеждаете цель объектно-ориентированного программирования. Возможно, пользователь хочет иметь более одной карты клиента, чтобы просматривать более одного клиента в разных окнах.

  • Моя идея использовать метод класса: "show", чтобы всегда показывать одну и ту же карточку клиента, тоже не очень хорошая идея. Теперь я считаю, что пользователь должен иметь возможность выбрать «Новая карточка клиента» в меню «Файл» или вернуться к существующей карточке клиента с помощью меню «Окно».

Это то, что я думаю сейчас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...