Вот резюме, которое я взял из приложения, которое уже работает, в котором обрабатываются родительское окно и лист.Аннотация здесь компилирует, запускает и отображает родительское окно, не получив сообщение, которое я отправил в его текстовое поле.При запуске создаются сообщения журнала «отсутствует сеттер или переменная экземпляра» для текстового поля, кнопки и самого окна.По какой-то причине я не смог правильно инициализировать родительское окно, и я подозреваю, что у меня будет такая же проблема с окном листа, но я не могу обойти эту проблему, чтобы отладить остальную часть приложения.
Я полагаю, что пропустил что-то фундаментальное в процессе подключения окна к его владельцу файла, хотя, глядя на инспектор соединений для .xib
, он показывает, что пользовательским классом является ParentClass, и выполняются различные подключения.Я не могу найти инструкций ни в документации Apple по лабиринту, ни здесь, в StackOverflow, которые бы помогли мне пройти через процесс подключения, который позволил бы мне обнаружить пропущенные части.
Все, что вы можете предложить, будет с благодарностью изучено..
ParentDelegate.h
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
@class ParentClass;
@interface ParentDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow * window;
@property (weak, nonatomic) ParentClass * parentController;
@end
ParentDelegate.m
#import "ParentDelegate.h"
@implementation ParentDelegate
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { }
- (void)applicationDidBecomeActive:(NSNotification *)aNotification { }
- (void)applicationDidResignActive:(NSNotification *)aNotification { }
- (BOOL)applicationShouldTerminateAfterLastWindowClosed:(NSApplication *)theApplication
{ return YES; }
- (NSApplicationTerminateReply)applicationShouldTerminate:(NSApplication *)sender
{ return NSTerminateNow; }
@end
ParentClass.h
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
@interface ParentClass : NSWindowController {
}
@property (assign) IBOutlet NSWindow * window;
@property IBOutlet NSTextField * messageTextField;
@property IBOutlet NSButton * proceedButton;
@property (strong) NSMutableString * parentPropInfo;
- (IBAction) awakeFromNib;
- (IBAction) doProceed:(id)sender;
@end
ParentClass.m
#import "ParentClass.h"
#import "ParentDelegate.h"
#import "SheetClass.h"
@implementation ParentClass
ParentDelegate * parentDelegate;
SheetClass * sheetController;
- (IBAction)awakeFromNib {
parentDelegate = [NSApplication sharedApplication].delegate;
parentDelegate.parentController = self;
sheetController = [[SheetClass alloc] initWithWindowNibName: @"SheetClass"];
_messageTextField.stringValue = @"Click Proceed button";
}
- (IBAction)doProceed:(id)sender {
_parentPropInfo = @"Hello!".mutableCopy;
[NSApp runModalForWindow:sheetController.window];
// Sheet active now until it issues endModal, then:
_messageTextField.stringValue = sheetController.sheetPropInfo;
[NSApp endSheet: sheetController.window];
[sheetController.window orderOut:self];
}
@end
SheetClass.h
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
@interface SheetClass : NSWindowController {
}
@property (assign) IBOutlet NSWindow * window;
@property (weak) IBOutlet NSTextField * propTextField;
@property (weak) IBOutlet NSButton * returnButton;
@property (strong) NSMutableString * sheetPropInfo;
- (IBAction)awakeFromNib;
- (IBAction)doReturn:(id)sender;
@end
SheetClass.m
#import "SheetClass.h"
#import "ParentClass.h"
@implementation SheetClass
ParentClass * parent;
- (IBAction)awakeFromNib {
parent.window = self.window.sheetParent;
_propTextField.stringValue = parent.parentPropInfo;
}
- (IBAction)doReturn:(id)sender {
_sheetPropInfo = @"Done!".mutableCopy;
[NSApp stopModal];
}
@end
В конечном итоге я хотел бы использовать это мини-приложение в качестве начального шаблона для нескольких других приложений.