Я перебираю несколько примеров банков кода и учебных пособий и просто спотыкаюсь, во многом это связано с тем, что эти учебные пособия написаны для Xcode <4.2 и ARC меняет несколько вещей. </p>
Я пытаюсь создать интерфейс с шаблоном проектирования MVC. Я использую базовый шаблон, предоставленный для делегата приложения. Я добавил класс с именем MainWindowController, который наследуется от NSWindowController. В Интерфейсном Разработчике сначала я удалил объект Window в nib-файле MainMenu (потому что я хочу его в отдельном файле). Я создаю новый интерфейс с именем MainWindow (.xib), меняю владельца файла на MainWindowController и добавляю делегата в список объектов. Сейчас что-то не щелкает.
Я не совсем понимаю, как или что мне нужно реализовать, чтобы делегат по существу загрузил и запустил оконный контроллер. Сначала я попытался связать выход «делегата» в окне с реальным делегатом приложения (называемый AppDelegate), а затем связал выход окна в классе «Делегат» с окном в 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 в главном файле пера или может делегировать эту задачу контроллеру (NSWindowController), что типично для приложений на основе документов или шаблонов проектирования MVC. Файл пера по умолчанию, указанный в Basic-info.plist, определяет, какой файл пера загружается. Как правило, пером по умолчанию должно быть главное меню, которое также загружает делегата. Затем делегат должен с помощью applicationDidFinishLoading: или awakeFromNib: выполнить инициализацию контроллеров и продолжить соответствующее делегирование в соответствии с шаблонами проектирования делегирования и mvc.
Основная проблема, с которой я столкнулся, - это запуск окна, что делает showWindow:. Обострение этой проблемы связано с исходным кодом из очень старого проекта Mac OS X, который использовал устаревшие функции и методы для выполнения делегирования и привел меня на неверный путь. Спасибо за ответ, в конечном итоге это заставило меня искать правильные вопросы в нужном месте, и я нашел правильный ответ.