从上一篇文章中,我在sqlite3中有以下视图:
CREATE View AttendeeTableView AS
SELECT (LastName || " " || FirstName) as AttendeeName,
CompanyName,
PhotoURI,
CompanyAttendeeRelation.CompanyId,
CompanyAttendeeRelation.AttendeeId
FROM Attendee
JOIN CompanyAttendeeRelation on CompanyAttendeeRelation.AttendeeId = Attendee.AttendeeId
ORDER BY LastName;
Run Code Online (Sandbox Code Playgroud)
现在,由于数据是从Attendee和之间的多对多关系生成的Company,我可以得到如下结果:
Doe John | company A | johnPic.png | 1 | 15
Doe John | company B | johnPic.png | 2 | 15
Run Code Online (Sandbox Code Playgroud)
我想做的是,在有多个公司(如上所述)的情况下,创建一个输出的查询:
Doe John | company A company B | johnPic.png | 1 2 | 15
Run Code Online (Sandbox Code Playgroud)
另一个输出:
Doe John | company A | company B …Run Code Online (Sandbox Code Playgroud) 我正在开发一个理想的目标应用程序,一直到iOS 3.2.不过,我正在Lion上开发它并使用最新的5 sdk.据我所知,我没有使用任何sdk 5特定功能.但:
在iOS 5或模拟器(设置为v.5)的任何设备上,该应用程序工作得很好.在iOS 4.3或更低版本的任何设备上(设置为v.4.3的模拟器都是如此),与视图帧有关的一些内容会出现错位.
例如,这里有两个例子:
警报视图中的活动指示器.这是代码:
NSURLConnection *urlConnection = [[NSURLConnection alloc] initWithRequest:fileRequest delegate:self];
if(urlConnection)
{
uistatusDialog = [[UIAlertView alloc] initWithTitle:(description ? NSLocalizedString(description, nil) : NSLocalizedString(@"Downloading", nil))
message:nil
delegate:nil
cancelButtonTitle:nil
otherButtonTitles:nil];
UIActivityIndicatorView *indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
indicator.autoresizingMask = (UIViewAutoresizingFlexibleLeftMargin |
UIViewAutoresizingFlexibleRightMargin |
UIViewAutoresizingFlexibleTopMargin |
UIViewAutoresizingFlexibleBottomMargin);
[indicator startAnimating];
[uistatusDialog addSubview: indicator];
[uistatusDialog show];
[indicator release];
Run Code Online (Sandbox Code Playgroud)
以下是两个模拟器的截图:iOS 5:正确
iOS 4.3:未对齐

我通过[UILabel alloc] initWithFrame:CGRectMake(...]设置帧的标签也发生了类似的事情.
这段代码,例如:
UITableViewCell * cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
reuseIdentifier:reuseIndentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.selectionStyle = UITableViewCellSelectionStyleGray; …Run Code Online (Sandbox Code Playgroud) 我有一个CALayer,我只是在控制器的initWithNibName中创建并添加到我的视图控制器主视图的子视图中:然后,我执行以下动画:
[CATransaction begin];
[CATransaction setAnimationDuration:2];
[logoLayer setOpacity:0];
[CATransaction commit];
Run Code Online (Sandbox Code Playgroud)
如何判断动画何时完成?performSelector:延迟2秒.方法似乎并不是"正确的方法".
我正在尝试在Core Data对象中归档/取消归档NSManagedObjectID,以便下次我的应用程序启动时,我可以检索这些ID并使用它们来获取特定对象.
我尝试像这样"存档"ID:
//defaultConfiguration is an NSManagedObject defined elsewhere and it works just fine...
// and newObject is also properly initialized, bound to a context,etc...
ArchivedID* newID = [NSEntityDescription insertNewObjectForEntityForName:@"ArchivedID" inManagedObjectContext:managedObjectContext];
[self.defaultConfiguration addArchiveIDObject:newID];
newID.idURI = [[newObject objectID] URIRepresentation];
[managedObjectContext save:&error];
Run Code Online (Sandbox Code Playgroud)
然后像这样取消归档(我只是去[anyObject]因为我正在测试,此时只有一个):
NSManagedObjectID* ID = [managedObjectContext.persistentStoreCoordinator managedObjectIDForURIRepresentation:[defaultConfiguration.archiveID anyObject]];
Run Code Online (Sandbox Code Playgroud)
但是当我尝试像上面那样获取URL时,我得到以下异常:
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[ArchivedID relativeString]: unrecognized selector sent to instance 0x7f59f20'
Run Code Online (Sandbox Code Playgroud)
实体中的属性通过Xcode设置为"可转换",我将Xcode中的变换器值字段留空,因为Core Data文档似乎暗示如果为空则使用默认变换器.
我究竟做错了什么?
我正在研究一些CoreAnimation的东西.带有几个视图控制器的导航控制器.并且视图控制器具有用于"小册子"的不同"页面"的UISCrollView.在每个页面上,可能会有一些动画在用户翻转到该页面时被触发.
我正在尝试这样的事情(对于一次性动画).
void (^animationBlock)() =
^{
static bool alreadyTriggered = NO;
if(alreadyTriggered)
return;
[CATransaction begin];
[CATransaction setCompletionBlock:
^{
alreadyTriggered = YES;
}];
// Do me some animations...
[CATransaction commit];
};
NSMutableDictionary* pageBlocks = [[NSMutableDictionary alloc] init];
[pageBlocks setObject:[animationBlock copy] forKey:<animation's name>];
[self.animationBlocks setObject:pageBlocks forKey:<some page number>];
[pageBlocks release];
[animationBlock release];
Run Code Online (Sandbox Code Playgroud)
"动画的名称"和"某些页码"是占位符以便解释(它们是任意的NSString文字).
触发这些动画的代码是:
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
int pageNumber = floor(self.scrollView.contentOffset.x / self.scrollView.frame.size.width);
NSMutableDictionary* pageBLocks = [self.animationBlocks objectForKey:[NSString stringWithFormat:@"page%i",pageNumber]];
[CATransaction begin];
for(id key in pageBLocks)
((void (^)())[pageBLocks objectForKey:key])();
[CATransaction commit];
} …Run Code Online (Sandbox Code Playgroud) 出于某些原因,我试图避免使用CAScrollLayer来执行此操作.我要追求的效果是逐步显示(从下到上)CALayer的内容(我之前加载的一个png).所以我想这样做:
layer.anchorPoint = CGPointMake(.5, 1);
CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"bounds.size.height"];
a.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut];
a.fillMode = kCAFillModeBoth;
a.removedOnCompletion = NO;
a.duration = 1;
a.fromValue = [NSNumber numberWithFloat:0.];
a.toValue = [NSNumber numberWithFloat:layer.bounds.size.height];
[layer addAnimation:a forKey:nil];
Run Code Online (Sandbox Code Playgroud)
这个问题是你可以告诉图层的内容是用边界缩放的.我试图改变界限,但内容始终保持原始大小,因此有效地界限剪辑图像,并且当我增加bounds.height时,图像"显示"本身.
关于如何实现它或者我可能缺少什么的任何想法?
请注意:这些是描述一般困境的代码片段。完整的代码确实包括“ include guards” / #pragma一次/ whathaveyou。
我正在实现用于遍历AST的访客模式,并且想知道解决以下问题的C ++方法是什么:
我有AST.h,它具有基本的AST节点类声明:
class Node
{
public:
virtual void accept(Visitor* v) {v->visit(this);}
};
Run Code Online (Sandbox Code Playgroud)
连同用于声明,表达式等的所有具体节点子类。
然后,我有了ASTVisitor.h,它声明了访问者接口,大致如下:
class Visitor
{
public:
Visitor() {}
virtual ~Visitor() {}
virtual void visit(StringElement* e) {}
virtual void visit(RealElement* e) {}
virtual void visit(IntegerElement* e) {}
...
Run Code Online (Sandbox Code Playgroud)
问题是,AST.h需要ASTVisitor.h,以便accept方法知道Visitor对象具有visit方法。就是说,Visitor和visit()都声明为virtual void accept(Visitor* v) {v->visit(this);}。但是同时,ASTVisitor.h需要AST.h,以便Visitor类知道Node的所有具体子类都存在。也就是说,例如,为String中的签名声明了StringElement。virtual void visit(StringElement* e)
但是将AST.h中的ASTVisitor.h和ASTVisitor.h中的AST.h包括在内,将导致Node类无法“看到” Visitor类,因此,它不能作为接受参数的类型有效。另外,像class Visitor;在AST.h中那样进行前向声明只能解决方法签名的类型问题,但是在方法内部v->visit(this)仍然无效,因为前向声明对Visitor类的方法一无所获。
那么解决这个问题的C ++方法是什么?
我正在尝试使用以下设置SpriteKit:
现在这里是问题,只要前景没有任何CIFilter或者具有shouldEnableEffects = NO,一切都很好.也就是说,我可以点击屏幕,我的游戏元素被实例化并添加到主场景中.但是当我尝试将CIGaussianBlur或CIBloom添加到前台时,我注意到两件事:
效果似乎是不断裁剪其内容或调整它的框架.也就是说,如果我有一个节点,"全屏"效果似乎试图不断裁剪或调整其边界到保持所有节点所需的最小区域.这适用于一个节点:

这适用于2个节点:

在OpenGL ES 2中,人们可以通过基本上将整个帧缓冲区(所有对象)渲染到纹理,然后在该纹理上至少再做一次模糊等传递,然后在附加到的帧缓冲区中呈现它来进行模糊/布局.显示或组合与原始渲染回到帧缓冲区.我希望SKEffectNode以类似的方式工作.然而,裁剪和糟糕的表现让我觉得我可能以错误的方式使用效果节点.有什么想法吗?
这很有趣......我认为通过这样做
CABasicAnimation* a = [CABasicAnimation animationWithKeyPath:@"opacity"];
a.fromValue = [NSNumber numberWithFloat:0.];
a.toValue = [NSNumber numberWithFloat:1.];
a.duration = .4;
a.fillMode = kCAFillModeBoth;
a.removedOnCompletion = NO;
CGFloat timeOffset = 0;
for(CALayer* layer in layers)
{
a.beginTime = [someCommonSuperView.layer convertTime:CACurrentMediaTime()fromLayer:nil] + timeOffset;
[layer addAnimation:a forKey:nil];
timeOffset += .4;
}
Run Code Online (Sandbox Code Playgroud)
我实际上总是修改相同的CABasicAnimation的beginTime并且只是增加它的引用计数.所以我不会让一系列的图层一个接一个地消失,而是应该搞乱所有图层的开始时间,可能导致所有这些图层在最后一个时刻出现.但上面的代码实际上似乎有效,因为这些层依次淡入淡出.
那么以这种方式重用动画是否有意义?为了不在每次传递中创建它的新实例?
addAnimation实际上是制作动画的深层副本而不是增加引用计数吗?
我不知道这在 C# 中是否可行。但这就是我想要做的:一个接口,声明一个带有完成块/回调/lambda/任何你想调用的方法的方法。看起来很简单。但是,这是第一次尝试:
namespace N {
interface MyInterface {
delegate void CompletionBlock();
void doSomething(CompletionBlock completionBlock);
}
}
Run Code Online (Sandbox Code Playgroud)
但接口不能声明委托。好吧,这个怎么样?
namespace N {
public delegate void CompletionBlock();
interface MyInterface {
void doSomething(CompletionBlock completionBlock);
}
}
Run Code Online (Sandbox Code Playgroud)
当然可以,但是现在,假设我声明了另一种类型的 CompletionBlock,例如它需要一个参数。我无法调用 CompletionBlock 类型,因为如果在同一命名空间内,它会与上述类型发生冲突。
然后是动作和功能。但即使 Action 也需要一个参数,而我不需要参数。因此,Action 似乎不是一个可行的候选者。真的,我想要的只是一种内联“匿名块”概念的方法,只要签名是 void(void) 即可。如下所示:
namespace N {
interface MyInterface {
void doSomething(typeof(()=>) completionBlock);
}
}
Run Code Online (Sandbox Code Playgroud)
但 lambda 在 C# 中并没有真正的类型。他们至少有签名吗?基本上,有什么办法可以解决这个问题吗?
例如,在 Objective-C 中,块的类型为 NSBlock,尽管它们的签名本身不易访问,但可以创建一种方法来获取具有特定签名的块。例如:
- (void)doSomething:(void(^)(void))completionBlock
Run Code Online (Sandbox Code Playgroud)
将是一个采用没有参数和没有返回类型的块的方法,并且您可以像这样调用该方法,例如:
[obj doSomething:^(){your block code}];
Run Code Online (Sandbox Code Playgroud) ios ×5
calayer ×2
cocoa ×2
cocoa-touch ×2
c# ×1
c++ ×1
core-data ×1
core-image ×1
database ×1
foundation ×1
header ×1
ios4 ×1
ios5 ×1
ios7 ×1
objective-c ×1
skeffectnode ×1
sprite-kit ×1
sql ×1
sqlite ×1
uiview ×1