所以关注这个问题在这里,我创建了两组新的文件:
JCScrollViewController.m
JCScrollViewController.xib
JCKeyboard.xib
Run Code Online (Sandbox Code Playgroud)
在JCScrollViewController.xib我只有一个滚动视图,scrollView连接到.m文件的出口,视图插座连接到视图.在JCScrollViewController.m符合的UIScrollViewDelegate.
在我的app委托中,我这样做:
JCScrollViewController *viewController = [[JCScrollViewController alloc] init];
[window addSubview:viewController.view];
Run Code Online (Sandbox Code Playgroud)
在JCScrollViewController.m我这样做-viewDidLoad:
//load your JCKeyboard.xib into a UIView object
NSArray *nibParts = [[NSBundle mainBundle] loadNibNamed:@"JCKeyboard"
owner:nil
options:nil];
//first object is the view
UIView *keyboard = [nibParts objectAtIndex:0];
//add keyboard to scrollView
[scrollView addSubview:keyboard];
//set content size to same dimensions as TallView.xib
scrollView.contentSize = CGSizeMake(320, 600);
Run Code Online (Sandbox Code Playgroud)
当我启动应用程序时,我收到此错误:
this class is not key value coding-compliant …Run Code Online (Sandbox Code Playgroud) #define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
Run Code Online (Sandbox Code Playgroud)
为什么three20认为释放后将ivar指定为nil是安全的?省略这ivar = nil一步是不安全的吗?
这就是我发现的全部内容:http: //github.com/facebook/three20/commit/1b946f475fb28d60e0aafc9ef394050c642c3a5b#commitcomment-115517
我不认为我在使用KVO/KVC,但我不确定.我现在正在读它.
谢谢!
马特
iphone objective-c key-value-observing key-value-coding three20
我刚学习收集操作员,我的第一个例子不起作用.我怎样才能解决这个问题?
NSArray *arr = [NSArray arrayWithObjects:[NSNumber numberWithInt:1],
[NSNumber numberWithInt:10],
[NSNumber numberWithInt:100],
[NSNumber numberWithInt:1000],
nil];
NSLog(@"%@", [arr valueForKeyPath:@"@min"]);
Run Code Online (Sandbox Code Playgroud)
我崩溃了:
这个类不是密钥min的密钥值编码兼容
这是我想要做的:在nib文件中设计一个视图.使用Swift编写的类返回视图和nib所有者.在Swift中实例化nib的视图.崩溃的代码:
var myViewOwner: MyViewOwner?
NSBundle.mainBundle().loadNibNamed("MyView", owner: myViewOwner, options: nil) // crash
Run Code Online (Sandbox Code Playgroud)
......有错误:
[NSObject 0x7bfa0cc0 setValue:forUndefinedKey:]:此类与密钥myView不符合密钥值编码.
所以,我有:带有空白视图的nib文件,其中视图是类型的类型MyClass和nib所有者MyViewOwner.这两个类都是用Swift编写的.
我将只发布MyViewOwner类代码,因为MyView.swift只是一个类定义.
MyViewOwner.swift
class MyViewOwner {
@IBOutlet weak var myView: MyView
}
Run Code Online (Sandbox Code Playgroud)
上面引起的错误.
当然Swift对象不符合KVO,所以我试过:
class MyViewOwner: NSObject {
@IBOutlet var myView: MyView
}
Run Code Online (Sandbox Code Playgroud)
......和:
class MyViewOwner: NSObject {
@IBOutlet strong var myView: MyView = MyView() // we need to set something since it's 'strong'
}
Run Code Online (Sandbox Code Playgroud)
两者都导致错误.
@objc class MyViewOwner: NSObject {
@objc @IBOutlet strong var myView: MyView …Run Code Online (Sandbox Code Playgroud) 我正在开发一个使用 Realm 作为数据库的项目(稍后会介绍)。我刚刚发现了键值编码,我想用它来将 TSV 表转换为对象属性(使用表中的列标题作为键)。现在它看起来像这样:
let mirror = Mirror(reflecting: newSong)
for property in mirror.children {
if let index = headers.index(of: property.label!) {
newSong.setValue(headers[index], forKey: property.label!)
} else {
propertiesWithoutHeaders.append(property.label!)
}
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有镜像的情况下迭代属性?我真的可以发誓,我在 Realm 文档(或者甚至在 Apple 的 KVC 文档中)中读到过,您可以做类似的事情for property in Song.properties或for property in Song.self.properties实现同样的事情。
除了效率更高一点之外,我想这样做的主要原因是因为在同一个地方我认为我读过这篇文章,我认为他们说迭代(或 KVC?)仅适用于字符串、整数、布尔值和日期,因此它会自动跳过作为对象的属性(因为您无法以相同的方式设置它们)。上面的代码实际上是我的代码的简化,在实际版本中,我目前正在跳过这样的对象:
let propertiesToSkip = ["title", "artist", "genre"]
for property in mirror.children where !propertiesToSkip.contains(property.label!) {
...
Run Code Online (Sandbox Code Playgroud)
我想象过这.properties件事吗?或者,有没有办法以这种方式进行迭代,自动跳过对象/类而不必像我上面那样命名它们?
谢谢 :)
我有这样的对象:
class Human: NSObject {
var name:String!
var age:Int!
}
Run Code Online (Sandbox Code Playgroud)
并从这样的对象生成实例:
let instance = Human()
Run Code Online (Sandbox Code Playgroud)
并设置我的值如下:
instance.name = "Kirk"
instance.age = 87
Run Code Online (Sandbox Code Playgroud)
并打印出来像这样:
print("name: \(instance.name)") // Kirk
print("age: \(instance.age)") //87
Run Code Online (Sandbox Code Playgroud)
一切都好.但是现在用另一种方式设置我的值:
instance.setValue("Kirk", forKey: "name")
instance.setValue(87, forKey: "age")
Run Code Online (Sandbox Code Playgroud)
获取Int dataType的此错误:
***由于未捕获的异常'NSUnknownKeyException'终止应用程序,原因:'[setValue:forUndefinedKey:]:此类不是密钥时代的密钥值编码兼容.
为什么会这样?
以及如何解决这个问题,因为我需要使用setValue()函数.
例如,我有可编码的结构User:
struct User: Codable {
// ...
var psnTag: String?
var xblTag: String?
var steamTag: String?
var nintendoTag: String?
var instagramId: String?
// ...
}
Run Code Online (Sandbox Code Playgroud)
和 stringKey as String= "psnTag"
如何通过 stringKey 从实例中获取值?
像这样:
let stringKey = "psnTag"
user.hasKeyForPath(stringKey) //return Bool
user.valueForPath(stringKey) //return AnyObject
Run Code Online (Sandbox Code Playgroud) 我需要暂时跟踪JavaScript中5个对象的状态.每个对象都有一个GUID作为其id.因此,我希望创建一个可以使用的键/值对数组.每对的关键是每个对象的id.每对的值将是一个布尔值.我的问题是,我真的不确定如何在JavaScript中执行此操作.目前,我有以下内容:
var myKeyValuePairs;
var myObjects = getMyObjects();
for (var i=0; i<myObjects.length; i++) {
var id = myObjects[i].id;
// What do I do now?
}
Run Code Online (Sandbox Code Playgroud)
如何在JavaScript中构建键/值对数组?
我有一个代表Flickr照片的NSDictionary.
照片的描述看起来像这样:
{
accuracy = 16;
context = 0;
dateupload = 1355106635;
description = {
"_content" = "Barclays Center Arena\nAtlantic Yards\nProspect Heights\nBrooklyn, New York";
};
farm = 9;
"geo_is_contact" = 0;
"geo_is_family" = 0;
"geo_is_friend" = 0;
"geo_is_public" = 1;
id = 8260097924;
isfamily = 0;
isfriend = 0;
ispublic = 1;
latitude = "40.681786";
longitude = "-73.972545";
originalformat = jpg;
originalsecret = cd1bdd846a;
owner = "62968578@N07";
ownername = atlanticyardswebcam02;
"place_id" = "uUNC_q9TWr1vROR4wA";
secret = 320e308baa;
server = 8502;
tags …Run Code Online (Sandbox Code Playgroud) 为什么NSString @"@"不符合关键值?还有其他不符合要求的字符串吗?
您可以尝试使用此代码失败,例如:
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"Some Object" forKey:@"@"];
NSString *theObject = [dict valueForKey:@"@"];
Run Code Online (Sandbox Code Playgroud)
将其设置为密钥是可以的,但不能查询该密钥.当然,您可以通过附加一些其他字符串来解决此错误,以后再删除另一个时间,例如在您想拥有密钥@时执行以下操作:
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"Some Object" forKey:@"keyConst@"];
NSString *theObject = [dict valueForKey:@"keyConst@"];
Run Code Online (Sandbox Code Playgroud) 我有一个NSObject带有一些属性的简单子类
@interface MyThing : NSObject
@property (nonatomic, copy) NSString *aString;
//... and so on
@end
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用键/值编码通过字典设置我的属性时:
+ (instancetype)thingFromDictionary:(NSDictionary *)dict
{
MyThing *newThing = [MyThing new];
for (NSString *key in dict)
{
if ([newThing respondsToSelector:@selector(key)])
{
//do stuff
[newThing setValue:[dict objectForKey:key] forKey:key];
}
else
{
NSLog(@"key %@ doesnt exist. value %@", key, [dict objectForKey:key]);
}
}
return newThing;
}
Run Code Online (Sandbox Code Playgroud)
事实证明,虽然字典包含与我的属性的确切名称匹配的键,但respondsToSelector:总是NO为这些键返回. 如何通过键/值方法确保可以访问所有属性?
谁能解释为什么这在 Objective-C 中有效?我希望它给出一个错误,因为一个对象被分配给一个 int 变量。我知道它确实有效,这很棒,但我想知道为什么允许这样做?
int i = [NSNumber numberWithInt:123];
Run Code Online (Sandbox Code Playgroud)
此外,这似乎存储了错误的值(即,在我的系统上,当我使用 NSLog 打印出“i”的值时,我得到的是“252711”而不是 123);但是,只有在我的主代码中声明和分配变量时。如果我将其声明为对象的实例变量,然后使用键值编码为其赋值,则它可以正常工作:
对象实例变量...
@interface myObject : NSObject
{
int anInt;
}
Run Code Online (Sandbox Code Playgroud)
主要代码...
[myObject setValue:[NSNumber numberWithInt:123] forKey:@"anInt"];
NSLog(@"%@", [myObject valueForKey:@"anInt"]);
Run Code Online (Sandbox Code Playgroud)
这段代码按预期打印出“123”,但我不确定为什么在使用上面看似相似的方法时它无法正常工作。
对于以下代码,在下面两行之前的两个注释中,只有第一个有效.
NSManagedObject * Event = [NSEntityDescription insertNewObjectForEntityForName:str inManagedObjectContext:app.managedObjectContext];
//Work but strange
[Event setValue:[NSNumber numberWithInt:buf4[v+h]] forKey:value];
//Error
Event.value= [NSNumber numberWithInt:buf4[v+h]];
Run Code Online (Sandbox Code Playgroud)
第二次返回并出错
request for member 'value' in 'Event', which is of non-class type 'NSManagedObject*'
Run Code Online (Sandbox Code Playgroud) key-value-coding ×13
objective-c ×5
ios ×4
swift ×4
iphone ×3
key-value ×2
core-data ×1
int ×1
ios6 ×1
ios7 ×1
javascript ×1
nib ×1
nsdictionary ×1
realm ×1
three20 ×1
uiscrollview ×1