Сообщение об ошибке «отсутствует установщик или переменная экземпляра» происходит при инициализации NSWindowController с Objective-C в Xcode: - PullRequest
0 голосов
/ 21 мая 2018

Вот резюме, которое я взял из приложения, которое уже работает, в котором обрабатываются родительское окно и лист.Аннотация здесь компилирует, запускает и отображает родительское окно, не получив сообщение, которое я отправил в его текстовое поле.При запуске создаются сообщения журнала «отсутствует сеттер или переменная экземпляра» для текстового поля, кнопки и самого окна.По какой-то причине я не смог правильно инициализировать родительское окно, и я подозреваю, что у меня будет такая же проблема с окном листа, но я не могу обойти эту проблему, чтобы отладить остальную часть приложения.

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

В конечном итоге я хотел бы использовать это мини-приложение в качестве начального шаблона для нескольких других приложений.

...