2011-12-15 2 views
2

Я просматриваю несколько примеров банков и учебников кода и просто полностью спотыкаюсь, многое из-за того, что эти учебники написаны для Xcode < 4.2, и ARC меняет некоторые вещи.Mac Development Building Basic Interface

Я пытаюсь построить интерфейс с шаблоном проектирования MVC. Я использую базовый шаблон для делегата приложения. Я добавил класс MainWindowController, который наследуется от NSWindowController. В интерфейсе Builder сначала я удалил объект Window в файле MainMenu nib (потому что я хочу его в отдельном файле). Я создаю новый интерфейс под названием MainWindow (.xib). Я меняю владельца файла на MainWindowController. Я добавляю делегата в список объектов. Теперь на данный момент что-то не щелкает.

Я не полностью понимаю, как и что мне нужно реализовать, чтобы делегат по существу загрузил и запустил Window Controller. Сначала я попытался связать выход для «делегата» в окне с фактическим делегатом приложения (называемый AppDelegate), а затем связать выход Window Out в классе Delegate с Window in Interface Builder.

Мне хотелось бы получить ответ на этот вопрос, но я был бы намного доволен правильной документацией, описывающей этот процесс. Я уверен, что есть что-то в MacDev, но мне трудно найти его.

Вот что я работаю с:

@class MainWindow; 

    @interface AppDelegate : NSObject <NSApplicationDelegate> 


    @property (strong) MainWindow *mainWindowController; 
    @property (assign) IBOutlet NSWindow *window; 

    @property (readonly, strong, nonatomic) NSPersistentStoreCoordinator *persistentStoreCoordinator; 
    @property (readonly, strong, nonatomic) NSManagedObjectModel *managedObjectModel; 
    @property (readonly, strong, nonatomic) NSManagedObjectContext *managedObjectContext; 

    - (IBAction)saveAction:(id)sender; 

    @end 

...

@implementation AppDelegate 

    @synthesize window; 
    @synthesize mainWindowController; 
    @synthesize persistentStoreCoordinator = __persistentStoreCoordinator; 
    @synthesize managedObjectModel = __managedObjectModel; 
    @synthesize managedObjectContext = __managedObjectContext; 

    - (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
    { 
     MainWindow *controller = [[MainWindow alloc] initWithWindowNibName:@"MainWindow"]; 
     mainWindowController = controller; 

    // ... the rest handles the ManagedObject Models... 

решение на сегодняшний день:

@synthesize mainWindowController = _mainWindowController; // IBOutlet is linked in IB 
//... 
- (void) applicationDidFinishLaunching: (NSNotification *) aNotification 
{ 
    //... initialization of event handling etc... 
    if (!_mainWindowController) _mainWindowController = [[ MainWindowController alloc] initWithWindowNibName:@"MainWindow"]; 
    [_mainWindowController showWindow: self]; 
    // ... 

Делегат приложение может управлять NSWindow в основном nib или он может делегировать эту задачу контроллеру (NSWindowController), который типичен для приложения на основе документа или шаблонов проектирования MVC. Файл nib по умолчанию, указанный в Basic-info.plist, определяет, какой файл nib загружен. Как правило, по умолчанию ниб должен быть основным меню, которое также загружает делегата. Затем делегат должен с помощью applicationDidFinishLoading: или awakeFromNib: выполнить инициализацию контроллеров и продолжить соответствующее делегирование в соответствии с шаблонами проектирования делегирования и mvc.

Основная проблема, с которой я столкнулся, - это запуск окна, которое выполняется showWindow:. Обострение этой проблемы произошло из исходного кода из очень старого проекта Mac OS X, в котором использовались устаревшие функции и методы для выполнения делегирования и привели меня к неправильному пути. Спасибо за ответ, он в конечном итоге заставил меня заглянуть в правильное место для правильных вопросов, и я нашел правильный ответ.

ответ

1

Ваша проблема заключается в том, что в этом втором XIb «MainWindow», новыйAppDelegate объект создается, что не имеет абсолютно ничего общего с AppDelegate объекта в «MainMenu» XIb. Объекты в каждом xib представляют собой реальные объекты, которые сериализуются и затем загружаются во время выполнения.

Эта конкретная проблема будет рассмотрена в Руководстве по управлению ресурсами, "Nib Loading". Я также могу предложить "Core Application Design".

Смежные вопросы