是否可以定义Objective-C块属性但在Xcode 4中仍然具有完整代码完成?
如果我使用typedef来定义块:
typedef void (^CompletionBlock)(MyObject *myObj);
然后定义属性:
@property (nonatomic, copy) CompletionBlock completionBlock;
然后@synthesize在调用setter时我没有得到完整代码完成的属性.Xcode将使用typedef,因此,代码完成不使用完整块语法完成块参数,它使用typedef.
如果我在标头中定义了一个使用完整块语法而不是typedef的方法原型:
@property (nonatomic, copy) void (^completionBlock)(MyObject *myObj);
然后我使用@synthesize,提供的setter接近使用完整的代码完成语法,但关键是它省略了参数名称:
[self setCompletionBlock:(void (^)(MyObject *)) { ... }
最后,如果我尝试@synthesize然后覆盖setter实现或将原型放在头文件中:
- (void)setCompletionBlock:(void (^)(MyObject *myObj))completionBlock {...}
会出现一条警告,指出属性类型与访问者类型不匹配.无论我如何尝试使用语法,我都无法定义块属性和具有完整代码完成语法的setter.我可以吃蛋糕吗?
谢谢!
我有一个Objective-C类别,我想在不重复类别中包含的代码的情况下添加到多个类中.我只想将相同的方法添加到多个类中.
我对现有类NSManagedObject的子类(Book,Chapter,Page),我想在所有这些子类的清洁和维护的方式添加常用功能.
一种方法是给类添加到他们的共同的超(NSManagedObject),但有增加类别的方法,所有的结果NSManagedObject子的时候我想的方法添加三个NSManagedObject子类(Book,Chapter,Page).
另一种解决办法是子类NSManagedObject,然后有Book,Chapter和Page来自继承NSManagedObject的子类.这是最干净,最直接的方法.这种方法的一大缺点是当数据模型发生变化并且Xcode重新生成子类时,它会将它们重置为继承NSManagedObject而不是继承SubclassedManagedObject.如果可能的话,我想避免使用像mogenerator/Xmo这样的东西.
是否可以在多个类上添加单个类别而无需重复代码?
谢谢.
对于cocoa,我有一个NSTableView设置为基于视图.选择行后,文本字段会将其颜色更改为白色.我该如何保持黑色?
我还应该注意,突出显示被设置为源列表(它在常规上做同样的事情).

未选中的行 
选定的行 
我希望有类似iOS的状态配置:

这是在WWDC 2011 Session 120中提出的,但它有点延迟,所以我不打算使用它.它可能适用于其他人.
- (void)tableViewSelectionDidChange:(NSNotification *)notification
{
[tableView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row){
NSTableCellView *cellView = [rowView viewAtColumn:0];
if(rowView.selected){
cellView.textField.font = [NSFont boldSystemFontOfSize:14];
}else{
cellView.textField.font = [NSFont systemFontOfSize:14];
}
}];
}
Run Code Online (Sandbox Code Playgroud) 我希望加快查询我的SQL支持的CoreData实例(显示按日期排序的记录).我知道索引可以帮助减少查询时间,但有什么区别:
突出显示属性所属的实体,然后将以逗号分隔的属性列表添加到索引字段中,如下所示:
或突出显示该属性,然后检查索引框,如下所示:
在Objective-C块的实现中调用超级方法吗?
当我在super上调用一个方法时,会抛出一个EXC_BAD_ACCESS错误但是只要我将这些调用改为[super methodToCall],[self methodToCall]并让消息向上移动响应者链就可以了.
-methodToCall在该类的实例中没有该块存在的实现,但是在超类中有一个(即,自己继承自的类).
我只是好奇地了解为什么在一个块的实现中调用一个方法在一开始是一个问题(技术上),所以我可以在将来避免它.我怀疑它与块中如何捕获变量以及堆栈和堆有关,但我真的没有具体的想法.
注意:在块存储在属性中之后几秒钟就会调用块实现代码,该属性使用copy,所以我不认为这是块的生命周期的问题,所有看起来都没问题.此外,这只是在iPhone设备(3G)上崩溃,但在iPhone模拟器中没有崩溃.
结果EXC_BAD_ACCESS:
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[super didRetrieveItems];
} else {
[super errorRetrievingItems];
}
}];
Run Code Online (Sandbox Code Playgroud)
完美,实现-didRetrieveItems和-errorRetrievingItems超级类.
[self retrieveItemsForId:idString completionHandler:^(NSError *error) {
if (!error) {
[self didRetrieveItems];
} else {
[self errorRetrievingItems];
}
}];
Run Code Online (Sandbox Code Playgroud) 我已经开始实现cvDisplayLink来驱动渲染循环而不是nstimer,详见本技术说明https://developer.apple.com/library/archive/qa/qa1385/_index.html
在displaylink回调本身中进行实际渲染是否更好,或者我应该在视图上调用setNeedsDisplay并让主线程进行渲染?
为了直接在回调中呈现,我需要锁定opengl上下文,这是我希望避免的.
是否可以使用cvDisplayLink进行计时并仍然在主线程上呈现?
提前感谢任何反馈......
我试图在10.7+上模拟Mail.app和Finder.app的标记化搜索功能,其中看起来像是一个NSSearchField,左边是搜索放大镜图标,右边是cancel(x)按钮,但是还包括搜索字段内的标记.

有没有办法让NSSearchField使用NSTokenFieldCell而不是NSSearchFieldCell?我已经尝试调用-setCell:NSSearchField实例,该实例可以通过调用po [searchField cell]调试器来替换单元格,但是搜索字段的绘制中断并且没有绘制文本字段.
我是以正确的方式接近这个还是有更好的方法来做到这一点?谢谢!
2016年10月25日更新:使用辅助功能检查器我发现Finder和Mail使用混合私有子类:
SGTSearchField : NSSearchField
SGTSearchFieldCell : NSSearchFieldCellSGTTokenFieldCell : NSTokenFieldCell这些是名为的私有框架的一部分Suggestions.framework.希望Apple将来能够公开这些课程.如果您希望公开此功能,请确保提交雷达.
我有一个表视图的NSTableCellView的设置基于视图NSTableView的图形通过在Xcode中对10.8.2最新版本的界面生成器.
当我在NSTableView上调用-reloadData时,它会崩溃:
Unable to simultaneously satisfy constraints:
(
"<NSAutoresizingMaskLayoutConstraint:0x105cb8bf0 h=--& v=--& V:[NSTableRowView:0x105ca7020(0)]>",
"<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-| (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1058d9770 h=--& v=-&- V:|-(1)-[GroupTableRowView] (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020 )>"
)
Will attempt to recover by breaking constraint
<NSAutoresizingMaskLayoutConstraint:0x10596aa30 h=--& v=-&- V:[GroupTableRowView]-(2)-| (Names: GroupTableRowView:0x100185860, '|':NSTableRowView:0x105ca7020 )>
Run Code Online (Sandbox Code Playgroud)
我无法关闭所涉及的任何视图上的自动调整大小掩码转换,因为它们的约束由NSTableView管理.很明显,约束是冲突的,因为NSTableRowView不可能具有0高度,同时仍然满足GroupTableRowView上的其他两个约束,这些约束指定了superview(行视图?)之间的强制填充.我不知道如何解决这个问题,我们将非常感谢任何见解.谢谢!
更新:我找到了解决方法.问题在于,由于某种原因{0, 0},在表视图上调用-reloadData时,NSTableRowView 的帧大小被发送.我-setFrameSize:在NSTableRowView子类中重写,只在大小不是时才将消息传递给响应者链{0,0}.
- (void)setFrameSize:(NSSize)newSize
{
if (!NSEqualSizes(newSize, NSZeroSize))
[super setFrameSize:newSize];
}
Run Code Online (Sandbox Code Playgroud)
要使用子类,请实现NSTableViewDelegate的-tableView:rowViewForRow:方法以返回自定义子类的实例.
- (NSTableRowView *)tableView:(NSTableView *)tableView rowViewForRow:(NSInteger)row
{
id rowView = [[GroupTableRowView alloc] init];
// …Run Code Online (Sandbox Code Playgroud) 我的可可应用程序设计是单个 .app(UI)和三个 XPC 服务。
主应用程序需要文件只读才能显示电源箱并在 UI 中显示所选路径
两个 XPC 服务需要文件只读
一项 XPC 服务需要文件读写
由于用户交互的流程,主应用程序会打开一个 powerbox 对话框,以允许用户选择目录并将其显示在 UI 中。然后主应用程序将其保存为安全范围的书签。书签数据根据需要通过 XPC 连接发送,每个单独的 XPC 进程解析书签以访问其自己沙箱中的这些文件。
问题是,除非我将主应用程序(打开 powerbox)设置为具有文件读写访问权限,否则需要写访问权限的 XPC 服务将无法获得它,即使其权利文件指定了文件读写访问权限。以下记录在控制台中:
deny file-write-unlink <file path>
Run Code Online (Sandbox Code Playgroud)
是否唯一的方法是为打开 powerbox 文件的主应用程序提供读写权限,或者重新设计 UI 流程以便需要写访问权限的进程显示 powerbox?最终目标是让每个进程拥有尽可能少的权限。理想的权利是在主 .app 进程中没有文件访问权限,两个 XPC 服务具有文件只读和一个 XPC 服务文件读写。谢谢!
编辑:
与用户交互以扩展您的沙箱的 OS X 安全技术称为 Powerbox。Powerbox 没有 API。当您使用 NSOpenPanel 和 NSSavePanel 类时,您的应用程序会透明地使用 Powerbox。
我有一个NSStackView以编程方式创建,并向其中添加了一个NSButton。
NSStackView *stackView = [[NSStackView alloc] initWithFrame:rect];
stackView.autoresizingMask = NSViewWidthSizable|NSViewHeightSizable;
stackView.alignment = NSLayoutAttributeBaseline;
(...)
NSButton *button = [[NSButton alloc] initWithFrame:CGRectMake(0, 0, 40, 50)];
button.image = item.image;
button.title = item.name;
button.bordered = NO;
button.imagePosition = NSImageAbove;
button.translatesAutoresizingMaskIntoConstraints = NO;
(...)
[stackView addView:button inGravity:NSStackViewGravityLeading];
Run Code Online (Sandbox Code Playgroud)
我期望这已经足够,因为按钮具有固有的内容大小(我检查了它是否返回了适当的值)。
检查视图层次结构,我可以看到按钮框是origin =(x = 0,y = 0)size =(width = 40,height = 50),其超级视图(NSStackViewContainer的一个实例)是origin = {x = 0 ,y = 0)size =(width = 0,height = 0),而NSStackView是origin =(x = 0,y = 0)size =(width = 400,height = 50)。
如您所见,NSStackViewContainer的宽度和高度为0 ...
如果我在按钮上添加了宽度和高度限制,则一切正常。为什么按钮的internalContentSize不够?
cocoa ×8
objective-c ×4
ios ×3
autolayout ×2
cocoa-touch ×2
block ×1
core-data ×1
entitlements ×1
macos ×1
nscell ×1
nsstackview ×1
nstableview ×1
nstextfield ×1
nstokenfield ×1
opengl ×1
sqlite ×1
xcode ×1
xcode4 ×1
xpc ×1