- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 NSView 子类,它具有我想绑定(bind)的属性。我在子类中实现了以下内容:
我的 View .h:
@property (readwrite, retain) NSArray *representedObjects;
我的 View .m:
@synthesize representedObjects;
+(void)initialize
{
[self exposeBinding: @"representedObjects"];
}
-(void)bind:(NSString *)binding toObject:(id)observableController withKeyPath:(NSString *)keyPath options:(NSDictionary *)options
{
if ([binding isEqualToString:@"representedObjects"]) {
[observableController addObserver: self forKeyPath:@"arrangedObjects" options:NSKeyValueChangeNewKey context:nil];
} else {
[super bind: binding toObject:observableController withKeyPath:keyPath options: options];
}
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ([keyPath isEqualToString:@"arrangedObjects"]) {
[self setRepresentedObjects: [object arrangedObjects]];
}
}
然后我在 -[AppController awakeFromNib]
中创建到 arrayController 的绑定(bind):
[myView bind:@"representedObjects" toObject:arrayController withKeyPath:@"arrangedObjects" options: nil];
这是实现绑定(bind)的正确方法吗?它涉及大量样板代码,这让我觉得我做错了什么。
我认为 NSObject 会自动实现我在 -bind:toObject:withKeyPath:options:
中手动完成的操作,但事实并非如此。如果我注释掉我的 -bind:toObject:withKeyPath:options:
,则永远不会调用 setRepresentedObjects 方法。
附加信息:我做了一些更多的调查,得出的结论是我原来的方法是正确的,你必须超越 -bind:toObject:withKeyPath:options:
。这是来自 Cocoa Bindings Programming Topics: How Do Bindings Work? 的引述:
In its bind:toObject:withKeyPath:options: method an object must as a minimum do the following:
- Determine which binding is being set
- Record what object it is being bound to using what keypath and with what options
- Register as an observer of the keypath of the object to which it is bound so that it receives notification of changes
The code sample in Listing 2 shows a partial implementation of Joystick’s bind:toObject:withKeyPath:options: method dealing with just the angle binding.
Listing 2 Partial implementation of the bind:toObject:withKeyPath:options method for the Joystick class:
static void *AngleBindingContext = (void *)@"JoystickAngle";
- (void)bind:(NSString *)binding
toObject:(id)observableObject
withKeyPath:(NSString *)keyPath
options:(NSDictionary *)options
{
// Observe the observableObject for changes -- note, pass binding identifier
// as the context, so you get that back in observeValueForKeyPath:...
// This way you can easily determine what needs to be updated.
if ([binding isEqualToString:@"angle"])
{
[observableObject addObserver:self
forKeyPath:keyPath
options:0
context:AngleBindingContext];
// Register what object and what keypath are
// associated with this binding
observedObjectForAngle = [observableObject retain];
observedKeyPathForAngle = [keyPath copy];
// Record the value transformer, if there is one
angleValueTransformer = nil;
NSString *vtName = [options objectForKey:@"NSValueTransformerName"];
if (vtName != nil)
{
angleValueTransformer = [NSValueTransformer
valueTransformerForName:vtName];
}
}
// Implementation continues...
这清楚地表明 Joystick 类(它是 NSView 的子类)需要覆盖 -bind:toObject:withKeyPath:options:
。
我觉得这很奇怪。我对这个结论持怀疑态度,因为我没有发现其他代码示例可以做到这一点。但是,正如 Apple 官方文档所说,我应该超越 -bind:toObject:withKeyPath:options:
我的结论是这是正确的方法。
如果有人能证明我是错的,我会很高兴!
最佳答案
不,你不应该需要那个胶水代码。
“似乎并非如此”是什么意思?如果省略它会怎样?
关于objective-c - 是否有必要重写 bind :toObject:withKeyPath:options: in an NSView subclass to implement binding?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/366938/
我想知道在从另一个扩展的类中创建对象的这两种方法之间是否存在任何功能差异。 我只是在处理基本的继承,除了 Cat extends Mammal 之类的东西之外没有什么复杂的。 最佳答案 ParentC
class superClass {} class subClass extends superClass{} public class test { public static void m
我有一个跨很多很多项目的 C# 解决方案。我创建了一个从 Systme.Diagnostics.Tracing.EventSource 继承的跟踪类,称为 MyCustomEventSource,它处
考虑以下示例,其中 Student 继承自 Person: function Person(name) { this.name = name; } Person.prototype.say =
基本上是标题所说的内容,但有一些详细说明。我有一个带有几个子类的父类(super class)。我需要一个 ArrayList 来保存两种类型的子类,因此需要 SuperClass 类型的 Array
我正在阅读 mughal 的 SCJP(第 3 版)(我遇到的最好的 SCJP 书),在第 727 页上,它说了以下内容: class MyIntList extends ArrayList {}
我使用方法 Object process( JobContext jobContext ); 以及名为 JobProcessImpl 的 impl 来定义 JobProcess。每当执行此 JobPr
如果我想编写一个采用可变数量“TDerived”的方法,其中 TDerived 是类“Base”的任何子类,有什么办法可以做到这一点吗? 以下代码仅适用于单个特定的指定子类: void doStuff
有没有人(本地)弄清楚如何对 SKNode 进行子类化以包含通过关节连接的多个物体 - 例如汽车? 似乎没有办法将子类的关节添加到父场景的物理世界属性中。 此外,当尝试编译并运行下面的对象时,即使没有
我正在尝试编写 Node 库的扩展。该库导出一个扩展 EventEmitter 的类(class LibClass extends EventEmitter)。它负责建立一个 websocket 连接
Tensorflow 有一些 docs用于子类化 (tf) Keras Model 和 Layer。 但是,尚不清楚使用哪个“模块”或“ block ”(例如,几个层的集合)。 由于从技术上讲它是几个
我正在尝试对 android.os.AsyncTask 类进行通用子类化。我基本上只想给它添加一个属性。问题是,我仍然希望能够将它用作匿名类。 import android.content.C
是否可以在 swift 中对通用结构进行子类化? 假设我们有一个结构: struct Foo {} 我想要“子类化”它以添加一些功能: struct Something {} struct Bar
class A: pass class B(A): pass ListOfA = List[A] list_of_a : ListOfA = [A(), A()] for e in [
我想通过打印选择器和参数来拦截发送到代理对象的消息。即使代理没有实现它们并且没有目标对象。请帮忙。我已经查看了几个选项和 Apple 文档,但他们假设您已经知道目标对象。我想干净地完成此操作,而不会出
我有一个使用核心数据并有两个目标的项目。这些目标有几个共享实体。目前,我正在维护两个具有重复实体的独立模型,在我看来,这效率不高。 有没有办法将共享数据模型作为具体目标中数据模型的父级? 最佳答案 我
我收到以下错误: Could not find matching constructor for: org.crawler.CrawlerUtils$fetch(org.series.crawler.
在 Knockout 中,我有一个 Setting 实体数组,它们可能具有不同的类型(即设置实体的“子类”)。这些类型是动态的,用户可以在 UI 中更改它们。根据设置实体的类型,它需要不同的对象属性,
我有一个ArrayClass并且mergeSortArray扩展了它。并且 mergeSortArray 包含一个 mergeSort() 方法。但是,由于我使用 super 从父类(super cl
我是 PyTorch 的新手,在使用不同的工具包一段时间后尝试它。 我想了解如何对自定义层和函数进行编程。作为一个简单的测试,我写了这个: class Testme(nn.Module):
我是一名优秀的程序员,十分优秀!