【问题标题】:NSObjectController confusion binding to a class property. Help!NSObjectController 混淆绑定到类属性。帮助!
【发布时间】:2010-02-09 22:04:25
【问题描述】:

我在自学可可,大部分时间都在享受这种体验。我整天都在为一个谷歌让我失望的简单问题而苦苦挣扎。我已经阅读了Cocoa Bindings Program Topics 并认为我理解了它,但仍然无法解决我的问题。

我有一个名为 MTSong 的非常简单的类,它具有各种属性。我使用@synthesize 来创建getter/setter,并且可以使用KVC 来更改属性。即在我的应用控制器中,以下工作:

mySong = [[MTSong alloc]init];
[mySong setValue:@"2" forKey:@"version"];

如果我在我的班级代码 MTSong.h 中做点什么:

#import <Foundation/Foundation.h>

@interface MTSong : NSObject {
    NSNumber    *version;
    NSString    *name;
}
@property(readwrite, assign) NSNumber *version;
@property(readwrite, assign) NSString *name;
@end

MTSong.m 是:

#import "MTSong.h"

@implementation MTSong

- (id)init
{
    [super init];
    return self;
}

- (void)dealloc
{
    [super dealloc];
}

@synthesize version;
@synthesize name;
@end

在 Interface Builder 中,我有一个标签 (NSTextField),每当我使用 KVC 更改歌曲的版本时,我都想更新它。我执行以下操作:

  1. 将 NSObjectController 对象拖到文档窗口和 Inspector->我设置的属性中:

    • 模式:类
    • 班级名称:MTSong
    • 添加一个名为 version 和另一个名为 name 的键
  2. 转到 Inspector->Bindings->Controller 内容

    • 绑定到:文件的所有者(不确定这是否正确...)
    • 模型密钥路径:版本
  3. 选择标签的单元格并转到检查器

    • 绑定到:对象控制器
    • 控制器密钥:mySong
    • 模型密钥路径:版本

我尝试将第 2 步中的模型键路径更改为“mySong”,这更有意义,但编译器会抱怨。任何建议将不胜感激。

斯科特


更新帖子评论

我没有公开 mySong 属性,所以将我的 AppController.h 更改为:

#import <Cocoa/Cocoa.h>
@class MTSong;

@interface AppController : NSObject {
    IBOutlet NSButton *start;
    IBOutlet NSTextField *tf;
    MTSong *mySong;
}
-(IBAction)convertFile:(id)sender;
@end

我怀疑文件的所有者错了,因为我没有使用基于文档的应用程序,我需要绑定到 AppController,所以现在是第 2 步:

  1. 转到检查器->绑定->控制器内容
    • 绑定到:应用控制器
    • 模型键路径:mySong

我需要将 3. 更改为

  1. 选择标签的单元格并转到检查器
    • 绑定到:对象控制器
    • 控制器键:选择
    • 模型密钥路径:版本

所有的编译都运行良好!

【问题讨论】:

  • 由于NSNumberNSString 都符合NSCopying 协议,您应该为这些属性使用copy 属性而不是assign。这可以防止您的属性设置为可变对象(例如NSMutableString)的问题。然后可以通过其他代码更改它,并且您的对象不包含您期望的值。
  • 谢谢 Rob 我已经更新了我的课程。

标签: objective-c cocoa interface-builder cocoa-bindings


【解决方案1】:

您希望按照您的建议将控制器的内容绑定到 mySong 密钥路径。您可能没有做的是将 mySong 公开为文件所有者(通常是您的应用程序委托)中的属性或实例方法。

【讨论】:

  • 感谢您的回复马丁。请参阅上面编辑过的帖子,了解我的更正,以解决您输入的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-14
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多