Objective c 如何使用绑定通过控制器将模型连接到视图?

Objective c 如何使用绑定通过控制器将模型连接到视图?,objective-c,cocoa,model-view-controller,binding,Objective C,Cocoa,Model View Controller,Binding,我的视图中有一个NSTextField。其值绑定到我的控制器中的NSNumber*number。控制器只需调用模型(value)即可获得适当的值 // In the controller - (NSNumber *)number { return [NSNumber numberWithFloat:[model value]]; } - (void)setNumber:(NSNumber *)aNumber { [model setValue:[aNumber floatValu

我的视图中有一个
NSTextField
。其值绑定到我的控制器中的
NSNumber*number
。控制器只需调用模型(
value
)即可获得适当的值

// In the controller
- (NSNumber *)number {
    return [NSNumber numberWithFloat:[model value]];
}
- (void)setNumber:(NSNumber *)aNumber {
    [model setValue:[aNumber floatValue]];
}
这很好,只有控制器没有收到模型更改的通知,因此,更改模型中的值不会更新
NSTextField

我能想到的唯一其他选择是让模型通知控制器,控制器通过插座手动更新视图。但这绕过了约束

// In the model, after value change
[[NSNotificationCenter defaultCenter] postNotificationName:@"ValueChanged" object:self];

// In the controller, after being notified
- (void)updateView:(NSNotification *)aNotification {
    [myTextField setFloatValue:[model value]];
}

是否有更好的绑定感知方式来实现此通信?

在控制器中,重写类方法。比如:

+(NSSet*) keyPathsForValuesAffectingValueForKey:(NSString*)key
{
   if([key isEqual:@"number"])
      return [NSSet setWithObject:@"model.value"];
   return [NSSet set];
}

(我不在我的Mac电脑上,所以这是未经测试的;但总体思路应该是合理的)

在控制器中,重写类方法。比如:

+(NSSet*) keyPathsForValuesAffectingValueForKey:(NSString*)key
{
   if([key isEqual:@"number"])
      return [NSSet setWithObject:@"model.value"];
   return [NSSet set];
}
(我不在我的Mac电脑上,所以这是未经测试的;但总体思路应该是合理的)

另一个选项(我通常自己做的,纯粹出于个人喜好)是(在控制器中):

同样,此代码未经测试,但总体思路应该是可行的。

另一个选项(我通常自己做的,纯粹出于个人喜好)类似于(在控制器中):

同样,此代码未经测试,但总体思路应该是可行的

我的视图中有一个NSTextField。它的值绑定到我的控制器中的NSNumber*编号。控制器只是通过调用模型(值)来获得适当的值

// In the controller
- (NSNumber *)number {
    return [NSNumber numberWithFloat:[model value]];
}
- (void)setNumber:(NSNumber *)aNumber {
    [model setValue:[aNumber floatValue]];
}
为什么此属性将值包装在NSNumber中?KVC将为您在对象之间转换基本值,例如
float
s

这很好,只有控制器不会收到模型更改的通知,因此,更改模型中的值不会更新NSTEXT字段

模型更改在这里不相关,并且控制器不需要知道模型属性更改的值,除非控制器正在观察该属性,在这种情况下,控制器会收到这些更改的通知,因为您正在使用模型的属性访问器

问题是您没有通过模型绑定文本字段,而是将其绑定到控制器上的假属性

因此,假设控制器已公开模型对象的属性,只需使用键路径
model.value
将文本字段绑定到控制器

我的视图中有一个NSTextField。它的值绑定到我的控制器中的NSNumber*编号。控制器只是通过调用模型(值)来获得适当的值

// In the controller
- (NSNumber *)number {
    return [NSNumber numberWithFloat:[model value]];
}
- (void)setNumber:(NSNumber *)aNumber {
    [model setValue:[aNumber floatValue]];
}
为什么此属性将值包装在NSNumber中?KVC将为您在对象之间转换基本值,例如
float
s

这很好,只有控制器不会收到模型更改的通知,因此,更改模型中的值不会更新NSTEXT字段

模型更改在这里不相关,并且控制器不需要知道模型属性更改的值,除非控制器正在观察该属性,在这种情况下,控制器会收到这些更改的通知,因为您正在使用模型的属性访问器

问题是您没有通过模型绑定文本字段,而是将其绑定到控制器上的假属性


因此,假设控制器已公开模型对象的属性,只需使用键路径
model将文本字段绑定到控制器。值

绑定到模型中是一个好主意吗?我有一种奇怪的坏感觉,我无法解释。好吧,这不是绑定。是KVO。绑定构建在KVO之上,但KVO是独立的。我不知道这是个好主意还是个坏主意。KVO只是一个工具。我喜欢让我的控制器观察我的视图,因为它感觉与我的耦合度较低。模型甚至不需要知道控制器的存在。我确信存在其他视点。将绑定到模型中是一个好主意吗?我有一种奇怪的坏感觉,我无法解释。好吧,这不是绑定。是KVO。绑定构建在KVO之上,但KVO是独立的。我不知道这是个好主意还是个坏主意。KVO只是一个工具。我喜欢让我的控制器观察我的视图,因为它感觉与我的耦合度较低。模型甚至不需要知道控制器的存在。我确信存在其他观点。