Я просматриваю несколько примеров банков и учебников кода и просто полностью спотыкаюсь, многое из-за того, что эти учебники написаны для 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, в котором использовались устаревшие функции и методы для выполнения делегирования и привели меня к неправильному пути. Спасибо за ответ, он в конечном итоге заставил меня заглянуть в правильное место для правильных вопросов, и я нашел правильный ответ.