В Objective-C, как сделать @ свойство доступным для других классов? - PullRequest
0 голосов
/ 13 мая 2018

Первоначальный вопрос остается ниже этого обновления:

Поэтому дальнейшие исследования показывают, что в моем

"... отсутствует сеттер или переменная экземпляра"

сообщения журнала происходят из-за нерешительности .xib.

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

Я восстановил розетки как свойства, а не iVars, и снова подключился, но безрезультатно.Так что я нахожусь в процессе переделки .xib с нуля.Следите за результатами.

Ниже следует оригинальный вопрос:

Объявив и синтезировав свойства в родительских и листовых классах, и попытавшись в них получить доступ к свойствам их соответствующим классом.property names, Xcode отклоняет код.

Недавно я опубликовал аналогичный вопрос и удалил его после того, как ему сообщили, что для ответа недостаточно информации, поэтому ниже я включаю мини-приложение, которое показывает, каксоответствующая настройка была в реальном приложении из более чем 2000 строк Objective-C, которое было построено и работало правильно, прежде чем я попытался добавить функцию свойств «Родитель / Лист».

Я указал сообщения об ошибках компилятора с префиксом////.Когда я закомментирую ошибочные строки, приложение с его сборками и .xib, разумеется, будет функционировать неправильно.

ParentClass.h

// ParentClass stuff belongs in the original main window controller
#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
@interface ParentClass : NSObject
{
    IBOutlet NSTextField * messageTextField;
    IBOutlet NSButton    * proceedButton;
}
@property (assign)  IBOutlet  NSWindow * window;
@property (strong)  NSMutableString * parentPropInfo;
- (IBAction) awakeFromNib;
- (IBAction) doCreate:(id)sender;
@end

ParentClass.m

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "ParentDelegate.h"
#import "ParentClass.h"
#import "SheetClass.h"
@implementation ParentClass
ParentDelegate     * MyDelegate;  // only confirms termination requests
NSWindowController * SheetController;
@synthesize parentPropInfo;
- (IBAction)awakeFromNib  {
    MyDelegate = [NSApplication sharedApplication].delegate;
    MyDelegate.ParentController = self;   // BTW, this property assignment works!
    SheetController = [[SheetClass alloc] initWithWindowNibName: @"SheetClass"];
    messageTextField.stringValue = @"Click Proceed button";
}
- (IBAction)doProceed*emphasized text*:(id)sender  {
    parentPropInfo = @"Hello!".mutableCopy;   // to be read by the sheet
    [NSApp runModalForWindow:SheetController.window];
    // Sheet is active now until it issues stopModal, then:

    messageTextField.stringValue = SheetController.sheetPropInfo;   // set by the sheet
////above gets ERROR "Property sheetPropInfo not found on object of type 'NSWindowController *'"

    messageTextField.stringValue = SheetController.window.sheetPropInfo;
////above gets ERROR "Property sheetPropInfo not found on object of type 'NSWindow *'"

    [NSApp endSheet: SheetController.window];
    [SheetController.window orderOut:self];
}
@end

SheetClass.h

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "ParentClass.h"
@interface SheetClass : NSWindowController
{
    IBOutlet NSTextField * propTextField;
    IBOutlet NSButton    * cancelButton;
}
@property (assign) IBOutlet NSWindow * window;
@property   NSMutableString * sheetPropInfo;
- (IBAction)awakeFromNib;
- (IBAction)doCancel:(id)sender;
@end

SheetClass.m

#import "SheetClass.h"
#import "ParentClass.h"
@implementation SheetClass
@synthesize sheetPropInfo;
- (IBAction)awakeFromNib  {

    propTextField.stringValue = self.window.sheetParent.parentPropInfo;  // set by the parent
////above gets ERROR "Property parentPropInfo not found on object of type 'NSWindow *'"

    sheetPropInfo = @"Goodbye!".mutableCopy;  // to be read by the parent
}
- (IBAction)doCancel:(id)sender  {
    [NSApp stopModal];
}
@end

Я ничего не могу найти в документации Apple или обширном (три недели сейчас!) Онлайн-поиске, чтобы предложить любую информациючто касается моего ужасного невежества.Я прошу прощения за огромный пакет кода, необходимый для иллюстрации моей проблемы!Где мне получить необходимую информацию?

1 Ответ

0 голосов
/ 13 мая 2018

Сообщения об ошибках совершенно четкие.Просто прочитайте их и подумайте о них.Давайте просто возьмем первый.Вы говорите:

messageTextField.stringValue = SheetController.sheetPropInfo;

... и получаете ответ от компилятора:

// Property sheetPropInfo not found on object of type 'NSWindowController *'

Хорошо, подумайте о выражении SheetController.sheetPropInfo и почему компилятор не может понятьЭто.Вы объявили SheetController следующим образом:

NSWindowController * SheetController;

Так что это все, что знает компилятор: SheetController является NSWindowController.Ну, конечно же, как говорит компилятор, sheetPropInfo не является свойством NSWindowController. Это свойство SheetClass (которое не совпадает с NSWindowController; это подкласс NSWindowController).

Если вы знаете, что SheetController на самом деле является экземпляром SheetClass, вам нужно сообщить об этом компилятору.Вы должны либо объявить SheetController как SheetClass, либо преобразовать его из NSWindowController в SheetClass.

...