相关疑难解决方法(0)

dispatch_async(dispatch_get_main_queue(),^ {...}); 等到完成?

我的应用程序中有一个场景,我想在一个方法中做一些耗费时间的任务,其中包括一些数据处理和UI更新.我的方法看起来像这样,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1
    // UI UPDATE 1

    // DATA PROCESSING 2
    // UI UPDATE 2

    // DATA PROCESSING 3
    // UI UPDATE 3
} 
Run Code Online (Sandbox Code Playgroud)

由于耗时我想在后台线程上进行数据处理,使用,

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, NULL), ^{
Run Code Online (Sandbox Code Playgroud)

但由于数据处理和UI更新都采用相同的方法,我只想在主线程中使用UI更新,

dispatch_async(dispatch_get_main_queue(), ^{
Run Code Online (Sandbox Code Playgroud)

最后我的方法看起来像这样,

- (void)doCalculationsAndUpdateUIs {

    // DATA PROCESSING 1 
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI UPDATE 1
    });

    /* I expect the control to come here after UI UPDATE 1 */

    // DATA PROCESSING 2
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI UPDATE 2
    });

    /* I expect the control …
Run Code Online (Sandbox Code Playgroud)

multithreading objective-c grand-central-dispatch ios dispatch-async

44
推荐指数
3
解决办法
11万
查看次数

NSTextField在NSTableCellView内部时不调用委托

我在我的应用程序中有一个相当普通的源列表(从对象库中拖出),其中包含一个NSTreeController数据源.我将DataCellNSTextField内部设置为可编辑,但我希望能够为某些单元格关闭它.我认为你这样做的方式是使用委托,但没有我试过的委托方法被调用.有什么我想念的吗?我的委托在我的XIB中设置了一个插座,它恰好是所有者的委托,同时实现了和 协议.NSTextFieldNSOutlineViewNSOutlineViewDelegateNSTextFieldDelegate

此外,我也不能使用旧–outlineView:shouldEditTableColumn:item: NSOutlineViewDelegate方法,因为这只适用于基于单元格的大纲视图(我假设是这种情况 - 大纲视图文档似乎没有为Lion更新,尽管类似NSTableView文档有,并且这些方法也没有调用).

更新

我在一个全新的测试项目中重现了这一点,因此它绝对与我的任何自定义类无关.按照以下步骤创建我的示例项目,并重现此问题.

  1. 在Xcode 4.1中,创建一个类型为Mac OS X Cocoa Application的新项目,不选择任何特殊选项
  2. 使用下面指定的内容创建两个新文件SourceListDataSource.mSourceListDelegate.m
  3. 在MainMenu.xib中,将a Source List拖到窗口上
  4. 2级拖动Object小号到坞(窗口的左侧),指定SourceListDataSource为一个类,并且SourceListDelegate对于其他
  5. 将大纲视图dataSourcedelegate插座连接到这两个对象
  6. NSTextField在大纲视图的列中选择DataCell视图的静态文本
  7. 打开其Value绑定,保持默认设置
  8. 将其delegate插座连接到Source List Delegate对象
  9. 将其Behavior属性设置为可编辑
  10. 构建并运行,然后在大纲视图中的任一单元格上单击两次.

预期:该领域不可编辑,并且有一个"好吧,我应该吗?" 日志中的消息

实际:该字段是可编辑的,不记录任何消息

这是框架中的错误,还是我应该以不同的方式实现这一目标?


SourceListDataSource.m

#import <Cocoa/Cocoa.h>

@interface SourceListDataSource : NSObject <NSOutlineViewDataSource>

@property (retain) NSArray …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c nsoutlineview nstextfield osx-lion

6
推荐指数
1
解决办法
3286
查看次数

我应该使用哪种委托方法来响应NSTextField上的点击?

我正在努力回应一个click内部textfield.点击发生时,我打开一个panel.我最初的想法是使用一种delegate方法来响应click事件 - 但我发现:

此方法不起作用:

(void)textDidBeginEditing:(NSNotification *)aNotification
Run Code Online (Sandbox Code Playgroud)

这种方法确实有效,但只有在我实际编辑文本字段中的文本时才会有效,而不是在我第一次单击它时.并且 - 如果我第二次编辑文本,此方法将停止工作:

(void)controlTextDidBeginEditing:(NSNotification *)aNotification
Run Code Online (Sandbox Code Playgroud)

我可以尽可能多地使用细节 - 或理想的代码示例.我知道一个nstextfield继承NSControl,其中有一个mouseDown事件.是否有类似的方式来响应事件textfield,也?

macos cocoa nstextfield

5
推荐指数
2
解决办法
5434
查看次数

NSTableView - 选择行并立即响应鼠标事件

我有一个基于NSTableView的视图,其中单元格包含许多控件,包括文本字段和编辑字段.当用户尝试单击单元格中的控件以便(例如)开始编辑文本字段时,将忽略单击的主要目标并选择单元格.然后需要再次单击以执行最初预期的操作,即使此单击在考虑之前也会受到延迟.

如何避免此问题并选择行并将鼠标事件一次性转发到控件?

macos cocoa nstableview nstablecellview

3
推荐指数
2
解决办法
3314
查看次数