Я не углублялся в раскадровки, но вот как это работает:
Если ваше приложение должно поддерживать 10.9 и ниже, создайте пользовательский подкласс NSWindowController
![Приложение на основе документов](https://i.stack.imgur.com/SIVmb.png)
Поместите такой код в подкласс NSDocument
- (void)makeWindowControllers
{
CustomWindowController *controller = [[CustomWindowController alloc] init];
[self addWindowController:controller];
}
Если в вашем приложении несколько окон, добавьте их сюда или где-нибудь еще (загружается по запросу), но не забудьте добавить его в массив документа windowscontroller (addWindowController :)
Если вы создаете их, но не хотите показывать все окна, переопределите
- (void)showWindows
{
[controller showWindow:nil]
}
Вы можете в любое время получить доступ к своей модели в своем оконном контроллере
- (CustomDocument *)document
{
return [self document];
}
Используйте привязки в вашем оконном контроллере (подкласс оконного контроллера + документ в пути к клавишам, который является свойством оконного контроллера)
[self.textView bind:@"editable"
toObject:self withKeyPath:@"document.readOnly"
options:@{NSValueTransformerNameBindingOption : NSNegateBooleanTransformerName}];
В отличие от iOS, большинство представлений отображаются на экране, поэтому вам нужно полагаться на шаблоны: делегирование, уведомление, события (цепочка респондентов) и, конечно же, MVC.
10.10 Изменения Йосемити:
NSViewController, начиная с 10.10, автоматически добавляется в цепочку респондентов (обычно цель действия неизвестна | NSApp sendAction: to: from :), и наконец реализованы все делегаты, такие как viewDidLoad ... знакомые по iOS. Это означает, что я больше не вижу большой пользы от создания подклассов NSWindowCotroller.
Подкласс NSDocument является обязательным, и достаточно NSViewController.
Вы можете в любое время получить доступ к своим данным в вашем контроллере представления
- (CustomDocument *)document
{
return (CustomDocument *)[[NSDocumentController sharedDocumentController] documentForWindow:[[self view] window]];
//doesn't work if you do template approach
//NSWindowController *controller = [[[self view] window] windowController];
//CustomDocument *document = [controller document];
}
Если вам это нравится (в соответствии с KVC / KVO), вы можете выполнить привязку, как написано выше.
Советы: правильно реализуйте UNDO для объектов модели в документе, например. или позорно вызовите updateChangeCount:
[[self.undoManager prepareWithInvocationTarget:self] deleteRowsAtIndexes:insertedIndexes];
Не помещайте в документ код, связанный с представлениями / окнами.
Разделите ваше приложение на несколько NSViewControllers, например.
- (void)prepareForSegue:(NSStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:AAPLListWindowControllerShowAddItemViewControllerSegueIdentifier]) {
AAPLListViewController *listViewController = (AAPLListViewController *)self.window.contentViewController;
AAPLAddItemViewController *addItemViewController = segue.destinationController;
addItemViewController.delegate = listViewController;
}
}
Предыдущий код вызывается на оконном контроллере с представлением в качестве делегата (снова возможно только после 10.10)
Я всегда предпочитаю использовать несколько XIB, а не одну гигантскую раскадровку / XIB. Используйте следующий подкласс NSViewController и всегда наследуйте от него:
#import <Cocoa/Cocoa.h>
@interface MyViewController : NSViewController
@property(strong) IBOutlet NSView *viewToSubstitute;
@end
#import "MyViewController.h"
@interface MyViewController ()
@end
@implementation MyViewController
- (void)awakeFromNib
{
NSView *view = [self viewToSubstitute];
if (view) {
[self setViewToSubstitute:nil];
[[self view] setFrame:[view frame]];
[[self view] setAutoresizingMask:[view autoresizingMask]];
[[view superview] replaceSubview:view with:[self view]];
}
}
@end
- Добавьте в проект подкласс MyViewController с помощью XIB. Переименуйте XIB
- Добавьте объект NSViewController в XIB и измените имя его подкласса
![Howto2](https: //i.stack .imgur.com / qQjxM.png )
- Измените имя загружаемого XIB на имя из шага 1
![Howto3](https: //i.stack. imgur.com/BoSvV.png )
- Свяжите представление, чтобы заменить представление, которое вы хотите заменить
Проверьте пример проекта Пример проекта Multi XIB < / а>
Вдохновляйтесь shapeart или lister или TextEdit
И настоящее руководство - использовать Hopper и посмотреть, как работают другие приложения.
PS: вы можете добавить свои представления / viewcontroller в цепочку респондентов вручную.
PS2: Если вы новичок, не переусердствуйте. Будьте довольны тем, что ваше приложение работает.
person
Marek H
schedule
01.09.2015