在Objective-C中,如何让@ property可以被其他类访问?

时间:2018-05-13 16:35:35

标签: objective-c properties parent

原始问题仍在此更新之下:

所以进一步的研究表明我的

  

“......缺少setter或实例变量”

日志消息归因于精确的.xib

我原本以为可能就是这种情况,这就是为什么我在图形界面构建器中重新连接出口和属性的过程,但这似乎不足以修复连接。

我将网点恢复为属性而不是iVars并再次重新连接,但仍无济于事。所以我正在从头开始重新构建.xib。请继续关注结果。

原始问题如下:

在父类和图纸类中声明和合成属性,并尝试通过各自的class.property名称访问属性,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 :(得分:3)

错误消息非常清楚。只需阅读它们并思考它们。让我们来看看第一个。你在说:

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。