gpt4 book ai didi

objective-c - QuickLook 消费者作为 NSViewController 的委托(delegate)

转载 作者:太空狗 更新时间:2023-10-30 03:26:38 26 4
gpt4 key购买 nike

我在从 NSView 中的表格实现 QuickLook 功能时遇到了一些问题。 QuickLook 上的有限文档真的一点用都没有。

看完Apple Docs之后(主要面向自定义生成器和插件),我最终查看了 QuickLookDownloader sample code .此代码基于基于文档的应用程序,但对我来说似乎是正确的方法(毕竟它是 Apple 的代码并且在他们的项目中确实有效)。

在我的实现中,我可以让 QuickLook 面板 正常显示,我也可以很容易地关闭它。但是,面板本身从不从我的 NSViewController 中调用委托(delegate)方法。结果,我什至从未显示过对象,只是显示“未选择任何项目”。我很难过。

我尝试调用 setDelegate,但如果我继续沿着这条路线继续下去,就会收到关于即将到来的厄运的警告...

[QL] QLError(): -[QLPreviewPanel setDelegate:] called while the panel has no controller - Fix this or this will raise soon. See comments in QLPreviewPanel.h for -acceptsPreviewPanelControl:/-beginPreviewPanelControl:/-endPreviewPanelControl:.

然后当尝试响应其中一个委托(delegate)方法时,无论如何都会发生 dealloc 的厄运。

是的,我确实阅读了标题,确认我应该在赢得小组讨论后设置委托(delegate)(请参见下面的代码)。

这是我的代码,除了 a) 我从中获取数据(我从 NSArrayController 获取)和 b) 我从中获取数据外,它与示例代码非常匹配预览项目来自(我的直接来 self 的模型对象 - 或者无论如何应该)

@interface MyViewController : NSViewController 
<QLPreviewPanelDataSource, QLPreviewPanelDelegate> {

QLPreviewPanel * previewPanel;
NSArrayController * myArrayController;
NSTableView * myTable;

// [...] Other instance vars
}

@implementation MyViewController

// [...] all the other methods, init, dealloc etc...

-(IBAction)togglePreviewPanel:(id)previewPanel {

if ([QLPreviewPanel sharedPreviewPanelExists] &&
[[QLPreviewPanel sharedPreviewPanel] isVisible])
{
[[QLPreviewPanel sharedPreviewPanel] orderOut:nil];
}
else
{
[[QLPreviewPanel sharedPreviewPanel] makeKeyAndOrderFront:nil];
}
}

-(BOOL)acceptsPreviewPanelControl:(QLPreviewPanel *)panel
{
return YES;
}

// This document is now responsible of the preview panel.
// It is allowed to set the delegate, data source and refresh panel.

-(void)beginPreviewPanelControl:(QLPreviewPanel *)panel
{

if (DEBUG) NSLog(@"QuickLook panel control did BEGIN");

previewPanel = [panel retain];
panel.delegate = self;
panel.dataSource = self;
}

// This document loses its responsisibility on the preview panel.
// Until the next call to -beginPreviewPanelControl: it must not change
// the panel's delegate, data source or refresh it.

-(void)endPreviewPanelControl:(QLPreviewPanel *)panel
{
[previewPanel release];
previewPanel = nil;

if (DEBUG) NSLog(@"QuickLook panel control did END");
}

// Quick Look panel data source

-(NSInteger)numberOfPreviewItemsInPreviewPanel:(QLPreviewPanel *)panel
{

if (DEBUG) NSLog(@"QuickLook preview count called");

return [[myArrayController selectedObjects] count];
}

-(id <QLPreviewItem>)previewPanel:(QLPreviewPanel *)panel
previewItemAtIndex:(NSInteger)index
{

if (DEBUG) NSLog(@"QuickLook preview selection of item called");

return [[displayAC selectedObjects] objectAtIndex:index];
}

-(BOOL)previewPanel:(QLPreviewPanel *)panel handleEvent:(NSEvent *)event {

if (DEBUG) NSLog(@"QuickLook panel error handler called");

// redirect all key down events to the table view

if ([event type] == NSKeyDown) {
[myTable keyDown:event];
return YES;
}

return NO;
}

问题似乎是 acceptsPreviewPanelControl 永远不会被调用,所以委托(delegate)永远不会被使用(他们绝对不会被调用)。

我确信这是我遗漏的一个简单步骤,但在剖析示例代码并浏览文档后,我没有看到答案。

是不是因为这一切都来自 NSViewController(尽管我认为没有理由将其纳入等式)?

非常感谢任何帮助。

解决方案更新

由于 Peter 的观察,修复很快。当调试器中的错误消息如其所言时,您不讨厌吗? :-)

在我加载了 MyViewController 的类中,我只需要添加三行代码即可解决问题。

// mainWindow is an IBOutlet to my window because the calling class 
// is a simple object and not an NSWindowController otherwise I could
// have used `self` instead of `mainWindow`

NSResponder * aNextResponder = [mainWindow nextResponder];

[mainWindow setNextResponder:myViewControllerInstance];
[myViewControllerInstance setNextResponder:aNextResponder];

工作完成 :-) 谢谢彼得。

最佳答案

如果您(还)不是它的委托(delegate)人,您为什么期望它向您发送委托(delegate)消息?如果您希望它向您发送委托(delegate)消息,那么您需要将自己设置为它的委托(delegate)。

I tried calling a setDelegate, but get warned about impending doom if I continue down that route...

[QL] QLError(): -[QLPreviewPanel setDelegate:] called while the panel has no controller - Fix this or this will raise soon. See comments in QLPreviewPanel.h for -acceptsPreviewPanelControl:/-beginPreviewPanelControl:/-endPreviewPanelControl:.

“没有 Controller ”,它说。所以,你需要它有一个 Controller 。

对该 header 的评论,尤其是关于 acceptsPreviewPanelControl: 和 QLPreviewPanel 实例方法 updateController 的评论表明,面板的 Controller (当它有一个时)是一个对象在响应者链中。因此,如果您的 Controller 没有成为面板的 Controller ,那是因为您的 Controller 不在响应链中。

所以,解决这个问题,然后它就会起作用。

我认为只要 View Controller 的 View 或其任何 subview 在响应器链中,您的 View Controller 就应该在响应器链中,但也许情况并非如此。 The documentation没说。如果所有其他方法都失败了,请将自己明确设置为某个 View 的下一个响应者(并将其之前的下一个响应者设置为您的下一个响应者),然后向预览面板发送一条 updateController 消息。

关于objective-c - QuickLook 消费者作为 NSViewController 的委托(delegate),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3836782/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com