我在实现自己的NSView子类的绑定方面遇到了麻烦.它工作正常,但是当从nib文件绑定到File的Owner时,保留周期存在问题.在阅读了一下之后,我发现Apple在几年前遇到了同样的问题,但已经修复了一些魔法未记录的类(NSAutounbinder).
这里有关于保留周期问题的冗长讨论http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600.解决方法是在释放窗口控制器之前取消绑定所有绑定,而不是在取消分配窗口控制器之前,在windowWillClose:之类的位置解除绑定.这似乎是对我不必要的黑客攻击.
我的问题是:有没有办法让自定义绑定与Apple制作的绑定一样好,而不使用未记录的功能?我是以错误的方式来做这件事的吗?
更新2:我找到了一个解决方案,允许手动实现的绑定与Apple的绑定完全一样.它利用了未记录的NSAutounbinder类,而没有实际使用未记录的功能.我将在今天晚些时候发布解决方案.
更新:我尝试过使用exposeBinding:,似乎没有任何区别.但是,NSObject执行bind:toObject:withKeyPath:options:半部作品.它传播从bindee到binder的变化(即从模型/控制器到视图),但不会以相反的方式工作.此外,虽然明显地观察到了这个垃圾箱,但是observeValueForKeyPath:ofObject:change:context:从未触发过.
示例项目:http://www.tomdalling.com/wp-content/BindingsTest.zip
Apple的文档表明,事实上,您必须覆盖bind:toObject:withKeyPath:options:以实现手动绑定.请看:http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
侧面注意:我已经调查了未记录的NSAutounbinder如何工作,这就是我所知道的.
当为NSWindowController创建绑定时,绑定对象实际上是一个NSAutounbinder,它是从NSWindowController获取的 - [NSWindowController _autounbinder].NSAutounbinder是NSWindowController对象的非保留代理.避免保留循环问题是不保留的.
当调用 - [NSWindowController release]并且retainCount == 1时,NSAutounbinder会解除对所有绑定的绑定.这可确保在取消分配对象之前没有悬挂指针.
我最近在玩GNU Bison的时候看过这样的一些函数定义:
static VALUE
ripper_pos(self)
VALUE self;
{
//code here
}
Run Code Online (Sandbox Code Playgroud)
为什么self括号外的类型?这是有效的C吗?
我一直在使用NSStrokeWidthAttributeName的NSAttributedString对象,因为它是画把大纲文本周围.问题是笔划位于文本的填充区域内.当文本很小(例如1像素厚)时,抚摸使文本难以阅读.我真正想要的是外面的中风.有没有办法做到这一点?
我试过NSShadow没有偏移和模糊,但它太模糊,很难看到.如果有办法增加阴影的大小而没有任何模糊,那也可以.
假设开发人员有兴趣学习Scrum,但团队中没有其他人感兴趣.我意识到Scrum是为团队制作的,并且必须修改该过程以适合单个人.
开发人员尝试使用Scrum是否有任何好处,即使团队没有?如果是这样,如何修改流程以适应这种情况?
我#EXT-X-PLAYLIST-TYPE:EVENT在播放列表中有一个HLS流.这在Safari中正常播放,除了#EXT-X-ENDLIST在播放列表中附加搜索之前无法进行搜索.
根据我的理解,#EXT-X-PLAYLIST-TYPE:EVENT到目前为止,播放列表包含视频的所有片段.也就是说,可以附加新段,但不能删除或修改现有段.如果之前的片段实际上是不可变的,那么Safari中的视频播放器是否应该允许用户在视频中向后搜索?相反,播放器只是说"直播"并且没有擦除控制,直到#EXT-X-ENDLIST附加到播放列表.
技术说明TN2288说明这一点(强调我的):
事件播放列表由EXT-X-PLAYLIST-TYPE标记指定,其值为EVENT.事件播放列表看起来就像现场播放列表一样.它最初没有EXT-X-ENDLIST标记,表示新媒体文件将在可用时添加到播放列表中.但是,使用EVENT标记,您根本无法更改播放列表; 您只能将新段添加到文件末尾.它们不能在前面添加.添加新段直到事件结束,此时附加EXT-X-ENDLIST标记.顾名思义,事件播放列表通常用于诸如音乐会或体育游戏之类的活动,您希望允许用户从头开始搜索事件中的任何位置.
听起来我觉得应该可以使用这种HLS播放列表,所以我错过了什么?
我可能正在为Cocoa应用程序编写一个插件系统(Mac,而不是iPhone).
一种常见的方法是将每个插件作为捆绑包,然后将捆绑包注入主应用程序.我关注这样做的安全隐患,因为bundle可以完全访问Objective-C运行时.我特别关注一个插件可以访问处理注册和序列密钥的代码.
我们正在考虑的另一个插件系统基于分布式通知.基本上,每个插件都是一个单独的进程,它们只能通过分布式通知进行通信.
有没有办法安全地加载捆绑包(例如沙盒)?如果没有,您是否发现使用分布式通知有任何问题?还有其他任何插件架构会更好吗?
我刚开始玩Clojure,我写了一个小脚本来帮助我理解一些功能.它开始是这样的:
(def *exprs-to-test* [
"(filter #(< % 3) '(1 2 3 4 3 2 1))"
"(remove #(< % 3) '(1 2 3 4 3 2 1))"
"(distinct '(1 2 3 4 3 2 1))"
])
Run Code Online (Sandbox Code Playgroud)
然后它通过*exprs-to-test*,评估所有,并打印输出如下:
(doseq [exstr *exprs-to-test*]
(do
(println "===" (first (read-string exstr)) "=========================")
(println "Code: " exstr)
(println "Eval: " (eval (read-string exstr)))
)
)
Run Code Online (Sandbox Code Playgroud)
上面的代码都运行正常.但是,(read-string exstr)重复,所以我试图let用来消除重复,如下所示:
(doseq [exstr *exprs-to-test*]
(let [ex (read-string exstr)] (
(do
(println "===" (first ex) "=========================") …Run Code Online (Sandbox Code Playgroud) 我有一个图像数组和两个nib文件.一个nib文件有一个窗口,在NSTableView中显示图像.另一个笔尖有一个窗口,可以将图像数组绘制到NSView中,还可以在所选图像上绘制一个突出显示.
图像数组由NSArrayController控制.我无法让两个笔尖共享NSArrayController.我会有两个单独的NSArrayControllers绑定到相同的内容,但我也希望两个笔尖共享控制器的选择; 也就是说,如果在表格窗口中选择图像,它也会在另一个窗口中被选中.
有没有标准的方法来做到这一点?
我正在寻找一个C库,它提供通用的集合数据结构,如列表,关联数组,集合等.库应该是稳定的并经过充分测试.我基本上寻找比蹩脚的C标准库更好的东西.
哪些C库适合这种描述?
编辑:我更喜欢这个库是跨平台的,但是失败了,任何适用于Mac/Linux的东西.
假设我有以下情况:
alt text http://img693.imageshack.us/img693/5818/controllerselection.png
当我在NSTableView中选择不同的行时,它会神奇地更新NSArrayController(PersonController)选择.NSTableView如何做到这一点?它是否像这样做:
- (void)bind:(NSString *)binding toObject:(id)observableController withKeyPath:(NSString *)keyPath options:(NSDictionary *)options;
{
if([observableController isKindOfClass:[NSArrayController class]]){
// got the NSArrayController, which can be used to change selection
} else {
// not an NSArrayController, don't try to change selection
}
//...
}
Run Code Online (Sandbox Code Playgroud)
我问,因为我正在实现我自己的可绑定NSControl,我希望它像NSTableView一样修改绑定的NSArrayController的选择.
cocoa objective-c nstableview nsarraycontroller cocoa-bindings
我正在研究制作一些使键盘功能像钢琴的软件(例如,用户按下'W'键,扬声器播放D音符).我可能会使用OpenAL.我理解数字音频的基础知识,但是在按键时播放实时音频会带来一些问题我无法解决.
问题在于:假设我有10个音频缓冲区,每个缓冲区都有一秒钟的音频数据.如果我必须在通过扬声器播放之前填充缓冲区,那么我会在播放前一两秒填充缓冲区.这意味着每当用户尝试播放音符时,按下琴键和正在播放的音符之间将有一到两秒的延迟.
你是如何解决这个问题的?你是否只是让缓冲区尽可能小,并尽可能地填充它们?有一些我不知道的伎俩吗?
让我说我显示一个这样的窗口:
[[TBAddTaskWindowController new] showWindow:self];
TBAddTaskWindowController对象意味着要发布在哪里?是否在windowWillClose中调用[self release]的通用解决方案?
让任何其他对象"拥有"窗口是不对的,因为它意味着存在直到用户关闭它.
我得到的错误是Xcode说3个未声明的内容(见下图) alt text http://snapplr.com/snap/ks4h
但在Header文件中我已声明它们(见下图)
alt text http://snapplr.com/snap/htmb
为什么我在声明它们时会收到这些错误.
完整代码:
头文件.
#import <Foundation/Foundation.h>
@interface HotKeyController : NSObject {
IBOutlet NSButton *cmdHK;
IBOutlet NSButton *ctrHK;
IBOutlet NSButton *optHK;
IBOutlet NSPopUpButton *keyHK;
IBOutlet NSWindow *window;
IBOutlet NSWindow *searchWindow;
IBOutlet NSWindow *entryWindow;
}
@end
Run Code Online (Sandbox Code Playgroud)
实施档案
#import "HotKeyController.h"
#include <Carbon/Carbon.h>
@implementation HotKeyController
OSStatus MyHotKeyHandler(EventHandlerCallRef nextHandler,EventRef theEvent,void *userData)
{
EventHotKeyID hkCom;
GetEventParameter(theEvent,kEventParamDirectObject,typeEventHotKeyID,NULL,sizeof(hkCom),NULL,&hkCom);
int l = hkCom.id;
switch (l) {
case 1: [window makeKeyAndOrderFront:NSApp];
break;
case 2: [searchWindow makeKeyAndOrderFront:nil];
break;
case 3: [entryWindow makeKeyAndOrderFront:nil];
break;
} …Run Code Online (Sandbox Code Playgroud) cocoa ×7
objective-c ×7
c ×2
agile ×1
appkit ×1
architecture ×1
audio ×1
clojure ×1
collections ×1
definition ×1
eval ×1
function ×1
h.264 ×1
latency ×1
let ×1
macos-carbon ×1
nstableview ×1
openal ×1
plugins ×1
real-time ×1
safari ×1
scrum ×1
synthesizer ×1
video ×1