我看到了Cocoa的KVC/KVO和绑定的一些古怪行为.我有一个NSArrayController对象,它的'content'绑定到一个NSMutableArray,我有一个控制器注册为该arrangedObjects属性的观察者NSArrayController.通过此设置,我希望每次修改阵列时都会收到KVO通知.但是,似乎KVO通知仅发送一次; 第一次修改数组.
我在Xcode中设置了一个全新的"Cocoa Application"项目来说明问题.这是我的代码:
BindingTesterAppDelegate.h
#import <Cocoa/Cocoa.h>
@interface BindingTesterAppDelegate : NSObject <NSApplicationDelegate>
{
NSWindow * window;
NSArrayController * arrayController;
NSMutableArray * mutableArray;
}
@property (assign) IBOutlet NSWindow * window;
@property (retain) NSArrayController * arrayController;
@property (retain) NSMutableArray * mutableArray;
- (void)changeArray:(id)sender;
@end
Run Code Online (Sandbox Code Playgroud)
BindingTesterAppDelegate.m
#import "BindingTesterAppDelegate.h"
@implementation BindingTesterAppDelegate
@synthesize window;
@synthesize arrayController;
@synthesize mutableArray;
- (void)applicationDidFinishLaunching:(NSNotification *)notification
{
NSLog(@"load");
// create the array controller and the mutable array:
[self setArrayController:[[[NSArrayController alloc] init] autorelease]]; …Run Code Online (Sandbox Code Playgroud) 在我的模型中,我得到了一个NSMutableArray跟踪元素数量变化的东西.在我看来,我得到了一个NSTextField显示元素数量.
视图从nib文件中取消归档并分配/进入模式.因此,它知道modell和包含的数组.
我建立了如下连接.在文本字段的Interface Builder中,我添加了一个Cocoa Binding "路径",如下所示:myModell.myArray.@count.通过这个我可以访问count属性(这是因为阵列本身必须不改变).
绑定基于键值合规性,我在模型中建立了这一点,因此可以访问数组.但是,关键价值合规不是问题的一部分.
我的问题:如何将绑定放入源代码而不将其写入Interface Builder?
cocoa interface-builder key-value-observing key-value-coding cocoa-bindings
在我的代码的某些部分,我需要这样的东西:
$product_type = $product->type;
$price_field = 'field_'.$product_type.'_price';
$price = $product->$$price_field;
Run Code Online (Sandbox Code Playgroud)
换句话说,我需要一种KVC - 意味着通过运行时生成的字段名称来获取对象字段.我只需要扩展一些现有的系统并保持字段命名约定,所以不要建议我改变字段名称.
我知道这样的东西适用于数组,当你可以通过以下方式轻松实现:
$price = $product[$price_field_key].
Run Code Online (Sandbox Code Playgroud)
所以我可以动态生成数组的键.但是如何为对象做到这一点?请帮助我,因为谷歌给了我数组等结果的河...谢谢
-setPrimitiveValue:forKey:不会触发KVO通知.但在我的大脑中,KVO只有在发生变化时才有意义.但是当我只是为了阅读而访问它时,怎么能改变呢?
-primitiveValueForKey:只获取某个键的对象.但它不会修改它.那么为什么这会在使用时导致KVO通知-valueForKey:呢?
(当然有一点,但我还没看到.)
我遇到了错误(在主题中说明),因为有时属性'id'不会在返回的json中存储包含'$ oid'的哈希.例如
有时我得到:
"ID":{ "$ OID": "4eea972209f47a0028000140"}
还有一些我得到的
"ID": "4eea972209f47a0028000140"
我正在尝试检查以下代码以迎合这种不规则性
if ([[question valueForKey:@"id"] valueForKey:@"$oid"])
{
question_id = [[question valueForKey:@"id"] valueForKey:@"$oid"];
}
else
{
question_id = [question valueForKey:@"id"];
}
Run Code Online (Sandbox Code Playgroud)
但是,由于代码在检查阶段失败,它仍然无效.
我怎样才能实现一个检查,这样我才能从'$ oid'中获取问题_id?
我rate通过像这样调用以下方法来观察AVPlayer 属性的变化:
addObserver:sharedPlayerManagerInstance
forKeyPath:@"rate"
options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld
context:0];
Run Code Online (Sandbox Code Playgroud)
因此,change我取回的字典observeValueForKeyPath:ofObject:change:context:是:
change = { kind: 1,
new: 1,
old: 0 }
Run Code Online (Sandbox Code Playgroud)
我检查了每个值的类,结果是__NSCFNumber。但是,当我尝试转换[change objectForKey:@"new"]或[change objectForKey:@"old"]转换为 int、NSInteger、NSNumber,甚至尝试 NSString 等时,它适用于“旧”,但它给了我“新”的解析错误:
error: expected a type
error: 1 errors parsing expression
Run Code Online (Sandbox Code Playgroud)
我真的需要比较它们,我无法弄清楚。这可能是iOS中的错误吗?
objective-c nsdictionary key-value-observing key-value-coding ios
我正在关注 Apple 的最新示例代码AVCam Swift,该代码已更新为使用AVCapture\xe2\x80\x8bPhoto\xe2\x80\x8bOutput。
\n\n\n\n\nvar isFlashScene: Bool { 获取 }
\n\n一个布尔值,指示相机当前预览的场景是否允许使用闪光灯。此属性\xe2\x80\x99s 值会根据相机当前可见的场景而变化。例如,您可以使用此属性突出显示应用程序 xe2x80x99s 相机 UI 中的闪光灯控制,向用户表明场景足够暗,可能需要启用闪光灯。如果照片捕获输出\xe2\x80\x99ssupportedFlashModes 值关闭,则此属性\xe2\x80\x99s 值始终为 false。该属性支持键值观察。
\n
我正在尝试键值观察这一点,以便当自动闪光模式指示这是闪光灯将闪光的场景时(就像库存的 iOS 相机应用程序一样),所以我可以更改 UI,就像文档注释一样。
\n\n所以我这样设置:
\n\nprivate let photoOutput = AVCapturePhotoOutput()\n\nprivate var FlashSceneContext = 0\n\nself.addObserver(self, forKeyPath: "photoOutput.isFlashScene", options: .new, context: &FlashSceneContext)\n\noverride func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {\n if context == & FlashSceneContext {\n print ("Flash Scene Changed")\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n上面从未显示出任何变化。即使我登录查看
\n\nprint (self.photoOutput.isFlashScene)\n …Run Code Online (Sandbox Code Playgroud) key-value-coding avfoundation ios swift avcapturephotosettings
我是一个完整的初学者,试图学习 Javascript。我正在尝试解决一个要求我返回分配给key的值的问题。该函数被称为getProperty并且我被卡住了 - 每次我尝试对代码运行测试时,它都会返回“应该返回位于传入键的对象中的属性的值”。
var obj = {key: 'value'};
function getProperty(obj, key) {
var o = obj.key;
return(o);
}
console.log(getProperty);
Run Code Online (Sandbox Code Playgroud) 我有一个NSDictionary字符串映射到数字,其中包含要在UI中编辑的对象的属性,例如
Length : 1Height : 2现在试图在UI绑定文本字段使用的项目在字典中的关键的关键路径在字典中的条目失败很惨,所以试图用字典中的简单访问条目valueForKey:像
NSLog(@"KVC: %@", [self valueForKey:@"keysAndValues"]);
Run Code Online (Sandbox Code Playgroud)
- >好的,转储显示Length存储在字典中.
NSLog(@"KVC: %@", [self valueForKey:@"keysAndValues.Length"]);
Run Code Online (Sandbox Code Playgroud)
[<YourClass 0x114608de0> valueForUndefinedKey:]:
此类与key keysAndValues.Length不符合键值编码.
有关如何使用非常通用的模型设置UI绑定的任何建议,其中包含存储在字典中的所有内容吗?我很确定我已经读过KVC/KVO,其中包含访问字典中单个条目的路径实际上有效 - 但是找不到主题了...
我有一些对象,我需要在其中找到特定键的总和.
我在对象中有以下属性
class Due: NSObject {
var dueIndex: Int?
var dueAmount: Double?
}
Run Code Online (Sandbox Code Playgroud)
我有以下逻辑将对象添加到数组
var duesArray = [Due]()
for i in 0..<10 {
let dueObject = NDDue();
// Update the due object with the required data.
dueObject.dueIndex = i
dueObject.dueAmount = 100 * i
// Add the due object to dues array.
duesArray.append(dueObject)
}
Run Code Online (Sandbox Code Playgroud)
在此之后,我需要将duesArray中的所有值与key dueAmount相加.请告诉我如何使用KVC实现它.
我试过使用下面的行.
print((duesArray as AnyObject).valueForKeyPath("@sum.dueAmount")).
Run Code Online (Sandbox Code Playgroud)
得到以下错误
failed: caught "NSUnknownKeyException", "[Due 0x7ff9094505d0> valueForUndefinedKey:]: this class is not key value coding-compliant for the key dueAmount."
Run Code Online (Sandbox Code Playgroud) key-value-coding ×10
ios ×5
cocoa ×3
objective-c ×3
swift ×2
arrays ×1
avfoundation ×1
core-data ×1
getproperty ×1
javascript ×1
nsarray ×1
nsdictionary ×1
object ×1
php ×1
undefined ×1