最初我认为这会起作用,但现在我明白它不会因为artistCollection是"Artist"对象的NSMutableArray.
@interface Artist : NSObject {
NSString *firName;
NSString *surName;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是,将"Artist"对象的NSMutableArray记录到磁盘的最佳方法是什么,以便我可以在下次运行应用程序时加载它们?
artistCollection = [[NSMutableArray alloc] init];
newArtist = [[Artist alloc] init];
[newArtist setFirName:objFirName];
[newArtist setSurName:objSurName];
[artistCollection addObject:newArtist];
NSLog(@"(*) - Save All");
[artistCollection writeToFile:@"/Users/Fgx/Desktop/stuff.txt" atomically:YES];
Run Code Online (Sandbox Code Playgroud)
非常感谢,这是我最好的一件事.如果"Artist"包含其他对象(Applications)的NSMutableArray(softwareOwned)的额外实例变量,我将如何扩展编码以涵盖此内容?我会将NSCoding添加到"Applications"对象,然后在编码"Artist"之前对其进行编码,还是有办法在"Artist"中指定它?
@interface Artist : NSObject {
NSString *firName;
NSString *surName;
NSMutableArray *softwareOwned;
}
@interface Application : NSObject {
NSString *appName;
NSString *appVersion;
}
Run Code Online (Sandbox Code Playgroud)
非常感谢
加里
通过查看文档,NSTextCheckingResult我认为如果找不到NSRegularExpression搜索中的匹配项,NSCheckingResult则将设置范围属性设置为{NSNotFound,0}
根据我在下面的测试,我发现如果找不到匹配,则将NSCheckingResult范围设置为{0,0}.这是一个小问题,但我只是想澄清一下我对它是如何工作的理解.
// REGEXPRESSION
NSString *textBuffer = @"1234567890";
NSString *pattern = @"(([A-Z]+))";
NSRegularExpression *regExp = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];
NSTextCheckingResult *match = [regExp firstMatchInString:textBuffer options:0 range:NSMakeRange(0, [textBuffer length])];
// ERROR CHECK
if([match range].location == NSNotFound) NSLog(@"Match Not found");
NSLog(@"location: %d", [match range].location);
NSLog(@"length : %d", [match range].length);
// OUTPUT
location: 0
length : 0
Run Code Online (Sandbox Code Playgroud)
编辑:在此示例NSTextCheckingResult *match中设置为nil,这可能是位置和长度返回零(消息到nil对象)的原因.
if(!match) NSLog(@"Match Not Found");
Run Code Online (Sandbox Code Playgroud)
因此我猜测NSNotFound只有当有多个捕获组时它才会返回,它代表一个空组.
是否有更快(或更好)的方法从UIColor获取[RGBA]颜色组件?这周围似乎有很多变化(有些在这里,所有基本上与我在这里所做的相似)我只是好奇,如果有一个替代,因为它似乎有点"缺乏",因为其他一切都是如此完整而深思熟虑.
if([eachKey isEqualToString:@"NSColor"]) {
UIColor *newColor = [attrs valueForKey:eachKey];
//NSLog(@"COLOR: %@", newColor);
CGColorRef colorRef = [newColor CGColor];
//NSLog(@"%@", colorRef);
int numComponets = CGColorGetNumberOfComponents(colorRef);
if(numComponets == 4) {
const CGFloat *components = CGColorGetComponents(colorRef);
CGFloat compR = components[0];
CGFloat compG = components[1];
CGFloat compB = components[2];
CGFloat compA = components[3];
//NSLog(@"R:%f G:%f B:%f, A:%f", compR, compG, compB, compA);
}
}
Run Code Online (Sandbox Code Playgroud)
我不是在寻找(我认为我有上面的长版本)我想知道这是不是你应该这样做的方式呢?
我正在开发一个应用程序,其中大部分UI是通过Xcode中的Storyboard设置的.我想要做的一件事是在TabBar上为UITabBarItem指定"完成"图像,而不是可以通过Interface Builder访问的默认"Stencilled"图像.
我的问题是哪里是最好的地方,我目前在awakeFromNib中这样做,因为它需要在故事板上取消归档时完成,但我不确定我是否应该使用initWithCoder:相反,哪个最好呢?这很重要吗?
- (id)initWithCoder:(NSCoder *)aDecoder {
self = [super initWithCoder:aDecoder];
if(self) {
UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"];
UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"];
UITabBarItem *tabBarItem = [self tabBarItem];
[tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn];
[tabBarItem setTitle:@"TWO"];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
要么
- (void)awakeFromNib {
[super awakeFromNib];
UIImage *tabIn = [UIImage imageNamed:@"TAB_IN"];
UIImage *tabOut = [UIImage imageNamed:@"TAB_OUT"];
UITabBarItem *tabBarItem = [self tabBarItem];
[tabBarItem setFinishedSelectedImage:tabOut withFinishedUnselectedImage:tabIn];
[tabBarItem setTitle:@"TWO"];
}
Run Code Online (Sandbox Code Playgroud)
据我所知,initWithCoder:当出口和操作尚未连接时,在从nib(包含在故事板中)取消归档对象的开始时调用.我也理解awakeFromNib在unarchiving过程结束时调用它并发出viewController现在可以使用的信号.我的感觉是,它实际上只取决于你想做什么,虽然使用awakeFromNib可能证明问题较少,因为你不会遇到出口和行动还没有联系起来的问题.
让我改这个,你会用什么情况下initWithCoder:作为并列于awakeFromNib反之亦然?
我刚刚意识到我可以NSDictionary使用objectForKey:和dict [key]访问?
NSDictionary *coordsDict = @{@"xpos": @5.0, @"ypos": @7.2, @"zpos": @15.7};
NSLog(@"XPOS: %@", coordsDict[@"xpos"]);
NSLog(@"XPOS: %@", [coordsDict objectForKey:@"xpos"]);
Run Code Online (Sandbox Code Playgroud)
任何人都可以告诉我,这一直是否一直向我隐瞒,或者是否有一些最新的语言变化?
编辑:这个问题一般不会引用新的字符串文字,但更具体地说是使用与NSArray相同的字符串文字语法来访问NSDictionary.我显然忽略了这一点,只是想检查何时添加了这个特定的语法.
我注意到SKNode方法children和childNodeWithName:名称暗示只返回查询节点正下方的子节点的结果.ie [root children];将返回NSArray包含节点的内容@[CUBE1, CUBE2, CUBE3].
在下图中,我想从ROOT(SKScene)级别下载到SPHERE2,以便我可以快速访问子节点.我希望这[root childNodeWithName:@"SPHERE2"];将遍历整个层次结构并返回指向SPHERE2的指针

我的问题:是否有一些我错过的东西让我跳到指定点的节点树(即使用节点名称)
我可以使用属性来存储指向树中重要位置的指针,然后使用它们来访问和处理任何子节点,这是一个选项......
有没有办法让粒子基于当前的"颜色渐变"以随机的每粒子颜色生成?颗粒在其使用寿命期间不会改变颜色,它们只是在出生时沿着"颜色斜坡"的某处分配颜色,并保持颜色直到它们死亡.
其结果是出生时的颗粒混合,从RED到BLUE的混合颜色.

在我的测试中,我似乎只能得到粒子产生为RED的行为,然后逐渐转向BLUE作为接近屏幕的底部.

我有一个SKSpriteNode,它是滚动背景(即孩子)的父级.SKSpriteNode不会自动移动,它只会随着滚动背景一起移动.在背景移动时找到SKSpriteNode的绝对位置的最佳方法是什么.
我很好奇今天遇到的一种情况,当我试图将一个人SKSpriteNode从一个人复制SKScene到另一个人时.在下面的游乐场的输出中,您可以看到复制后都维护linearDamping和/ angularDamping或不维护(它们似乎都回退到默认值)
// PLAYGROUND_SW1.2 - SKSpriteNode Copy
import UIKit
import SpriteKit
// ORIGINAL
let spriteNode = SKSpriteNode()
spriteNode.name = "HAPPY_NODE"
let size = CGSize(width: 55.0, height: 150.0)
let physics = SKPhysicsBody(rectangleOfSize: size)
physics.linearDamping = 0.123
physics.angularDamping = 0.456
spriteNode.physicsBody = physics
// COPY
let spriteCopy = spriteNode.copy() as! SKSpriteNode
// ORIGINAL
spriteNode.name
spriteNode.physicsBody?.linearDamping
spriteNode.physicsBody?.angularDamping
spriteNode.physicsBody?.area
// COPY
spriteCopy.name
spriteCopy.physicsBody?.linearDamping
spriteCopy.physicsBody?.angularDamping
spriteCopy.physicsBody?.area
Run Code Online (Sandbox Code Playgroud)
游乐场输出

我不确定我是否正确地复制了这两个SKSpriteNode并且SKPhysicsBody符合NSCopying如果你看看上面的输出area属性是在复制后维护的,据我所知这是基于创建size时指定的 …
objective-c ×7
sprite-kit ×4
cocoa-touch ×3
iphone ×3
sknode ×2
awakefromnib ×1
cocoa ×1
copy ×1
ios ×1
ios7 ×1
nsdictionary ×1
regex ×1
skspritenode ×1
swift ×1
xcode ×1