Objective-C 有一种setValue方法允许开发人员通过字段名称为字段设置特定值。
我如何在 Swift 中做到这一点而不继承 NSObject 并实际使用该setValue方法?
我无法在文档中找到他们解释所有这些领域及其含义的内容.特别是"控制器键"对我来说并不清楚.
cocoa interface-builder key-value-observing key-value-coding cocoa-bindings
在我的iOS项目中更新Core Data模型的过程中,我正在向服务器查询JSON对象,这些对象在某种程度上与我模型的托管实体相对应.我正在努力的最终结果是来自JSON输出的可靠更新解决方案.
对于这个问题中的示例,我将命名核心数据管理对象existingObj和传入的JSON反序列化字典updateDict.棘手的部分是处理这些事实:
existingObj都存在于updateDictupdateDict都可用extistingObj.existingObj的属性都与JSON反序列化属性匹配.(某些字符串可能需要自定义的Objective-C包装器).updateDict可能包含未初始化(nil)的键的值existingObj.这意味着在迭代更新的字典时,必须对来回进行一些属性测试.首先我要测试是否updateDict存在属性existingObj,然后我使用KVC设置值,如下所示:
// key is an NSString, e.g. @"displayName"
if ([existingObj respondsToSelector:NSSelectorFromString(key)) {
[existingObj setValue:[updateDict objectForKey:key] forKey:key];
}
Run Code Online (Sandbox Code Playgroud)
虽然这部分有效,但我不喜欢这样的事实,即我实际上是displayName作为一个吸气剂进行测试,而我正要打电话给setDisplayName:设定者(间接通过KVC).我更喜欢的是[existingObj hasWritablePropertyWithName:key],但是我找不到这样做的东西.
这使得子问题A:如果只有属性的名称,如何测试属性设置器?
下一部分是我想根据其类型自动识别属性的地方.如果两个updateDict和existingObj有一个NSString关键@"显示名",设置新的价值很容易.但是,如果updateDict包含@ @ niceShadeOfGreen的键@"color"的NSString,我想将其转换为正确的UIColor实例.但是我如何测试接收属性的类型,existingObj以便我知道何时转换值以及何时简单地分配?我希望有类似于NextSelector的东西:
if ([existingObj typeOfSelector:sel] == [[updateDict objectForKey:key] class]) {
// regular assignment
} else { …Run Code Online (Sandbox Code Playgroud) properties exists css-selectors key-value-coding objective-c-2.0
我正在阅读一本关于 Objective-c 的书并了解撤消管理器。这个概念看起来很简单,但提供的例子似乎过于复杂。基本上,我有一个连接到 NSArrayController 的表视图,我在数组中添加或删除人员,我可以编辑他们的名字和内容。因为示例使用 NSArrayController 和绑定,添加和删除是自动的,所有编辑都是自动的。
要使用撤消管理器,据我所知,我需要实现自己的方法来添加/删除/编辑。
由于键值编码,我已经实现了这些方法来进行添加和删除并自动调用:
- (void)removeObjectFromEmployeesAtIndex:(int)index;
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index;
Run Code Online (Sandbox Code Playgroud)
然后为了编辑,我必须将该类注册为观察者并观察更改以进行编辑:
- (void)changeKeyPath:(NSString *)keyPath
ofObject:(id)obj
toValue:(id)newValue
Run Code Online (Sandbox Code Playgroud)
以下是我的问题:
为什么我要做这么多?我的理解是,使用 NSArrayController 和绑定应该使添加/删除/编辑项目更容易和更自动化。但是如果我必须手动实现所有这些方法只是为了添加撤消支持,为什么要使用 NSArrayController 或绑定呢?
幕后发生了什么?在 Interface Builder 中,添加按钮连接到 NSArrayController 上的添加方法。那么如何调用我的 insertObject 方法呢?我知道这是通过键值编码,但是是什么让 NSArrayController 的 add 方法被覆盖只是 b/c 我的文档实现了这个方法?
解决方案是不对称的。我使用一个概念来处理撤消添加/删除,使用另一个概念来处理撤消编辑。我不能也只观察数组的变化吗?我想它会使observeValueForKeyPath 方法复杂化,但这会更有意义吗?
cocoa objective-c key-value-observing key-value-coding nsarraycontroller
我正在制作一个使用UITableViewController的应用程序,我正在尝试添加一个UISearchBarWithDisplayController.(我正在使用这个教程:http://www.appcoda.com/search-bar-tutorial-ios7/).我按照所有步骤操作,但是当我在搜索视图中按键盘上的字母时,应用程序崩溃,我收到此错误:
2014-05-28 19:11:03.850 Williams[1353:60b] *** Terminating app due to
uncaught exception 'NSUnknownKeyException', reason:
'[<__NSCFConstantString 0x100219d80> valueForUndefinedKey:]: this
class is not key value coding-compliant for the key name.'
*** First throw call stack: (0x186b8a950 0x1930901fc 0x186b8a5d4 0x1876db618 0x187624bdc 0x18766d8e8 0x18766d3d0 0x18766c1d4
0x18766c150 0x18766bf28 0x100038904 0x100038af8 0x189d6c558
0x189b890e8 0x189b8905c 0x189b72538 0x189d6c264 0x189b93a64
0x189d27a7c 0x189d26dfc 0x189d26ae4 0x187634a20 0x189b97e58
0x189d269ac 0x189b7d2f0 0x18770c5cc 0x186b4b044 0x186b4a3a0
0x186b48638 0x186a896d0 0x18c76dc0c 0x189bbafdc 0x10003970c
0x193683aa0) libc++abi.dylib: terminating with uncaught exception of
type NSException
Run Code Online (Sandbox Code Playgroud)
当我按下键盘上的一个字母并且像这样卡住时它会崩溃:

还有一点很奇怪的是,如果我在iOS模拟器中崩溃,它会给我一个不同的崩溃报告: …
根据Apple的文档"要更新一次值,使用键值编码:调用setValue:forKey:方法,提供着色器源代码中的统一名称作为键,并提供适当类型的数据作为值."(取自SCNProgram类参考).
但是,我不能让这个工作.
我有一个SCNMaterial子类,设置一个新的SCNProgram实例,加载顶点和片段着色器.我一直在handleBindingOfSymbol用来设置自定义变量,例如
self.stringMaterial.handleBindingOfSymbol("waveAmplitude") {
programID, location, renderedNode, renderer in
glUniform1f(GLint(location), Float(self.amplitude))
}
Run Code Online (Sandbox Code Playgroud)
这是正常的.
为了提高效率,我希望能够使用键值编码.但是,如果我用上面的代码替换
self.stringMaterial.setValue(Float(self.amplitude), forKey: "waveAmplitude")
Run Code Online (Sandbox Code Playgroud)
着色器中的统一值为0.0.
有人对这个有经验么?(我在MacOS上这样做,但我希望它在iOS上也一样.)
考虑以下对象:
struct User: Codable {
let id: Int
let email: String
let name: String
}
Run Code Online (Sandbox Code Playgroud)
是否有可能获得CodingKey给定的特定信息KeyPath?
let key = \User.name.codingKey // would be equal to string: "name"
Run Code Online (Sandbox Code Playgroud) 是否可以使用NSArrayController将NSTextField值绑定到数组中的特定项?特别是,我想绑定到数组中第一项的属性,如果数组为空则不显示任何内容.
使用arrangedObjects.command节目只是"(" - 大概是它试图用每个项目显示一个逗号分隔的字符串的多行字符串.我只想要第一个.
cocoa key-value-observing key-value-coding nsarraycontroller cocoa-bindings
我正在考虑使用NSMutableDictionary代替我当前的NSMutableArray.这主要是出于KVC/KVO的原因.该集合将在我的绘图方法的内循环中经历重度变异.如果我继续进行此次更换,我是否可以预期会受到重大影响?
干杯,道格
performance cocoa key-value-observing key-value-coding data-structures
在我的界面中,我有一个NSTextField谁value被绑定了NSArrayController's selection.selectedType.title.所有NSArrayController's对象都是自定义对象,每个对象有两种方法:
- (MYType *)selectedType;
- (void)setSelectedType: (MYType *)type;
Run Code Online (Sandbox Code Playgroud)
在不具有伊娃selectedType.但是,他们确实拥有一个容纳所有MYType物体的iVar .代码归结为:
- (MYType *)selectedType
{
if (someIndex == 0)
return [types objectAtIndex: 0];
else
return [self typeWithIndex: someIndex];
}
- (void)setSelectedType: (MYType *)type
{
someIndex = [type index];
}
Run Code Online (Sandbox Code Playgroud)
MYType对象得到了NSString *title一个相应的@property和iVar synthesize.
每当我打电话setSelectedType:,变化立即可见,NSTextField并且一切似乎都有效,但我得到一条日志消息说:
无法从MYType 0x1a4830中删除关键路径"selectedType.title"的观察者NSArrayController 0x141160,这很可能是因为在没有发送适当的KVO通知的情况下,"selectedType"键的值已更改.检查MYType类的KVO兼容性.
我尝试setSelectedType:使用willChangeValueForKey:和封装方法didChangeValueForKey:然后我仍然有一个日志消息,但不同的一个:
无法从MYType 0x1a4be0中删除关键路径"title"的观察者NSKeyValueObservance 0x1c7570,因为它未注册为观察者.
objective-c key-value-observing key-value-coding nsarraycontroller cocoa-bindings
key-value-coding ×10
cocoa ×4
objective-c ×2
swift ×2
codable ×1
exists ×1
ios ×1
ios7 ×1
opengl ×1
performance ×1
properties ×1
scenekit ×1
swift4 ×1
xcode5 ×1