【问题标题】:The blue focus ring outside NSTextField missing?NSTextField 外面的蓝色对焦环不见了?
【发布时间】:2013-03-07 03:03:48
【问题描述】:

在正常情况下,一个蓝色的矩形会出现在成为第一响应者的 NSTextField 对象之外,如下图:
link for Normal Case

但是,我得到了一个没有蓝色边框的 NSTextField。这是为什么呢?

它是这样发生的:
1> 我创建了一个典型的 MAC OS 应用程序。
2> 我通过调用相应视图的 addSubview:removeFromSuperview 方法来切换应用的子视图。
3> 在一个子视图(实际上是上面引用的图像)中,我单击“下一步”按钮。它的动作是这样的(在子视图的控制器 .m 文件中定义):

- (IBAction)actionNextClicked:(id)sender{
//_hdlThreadNext is a NSThread object
    [[_hdlThreadNext alloc] initWithTarget:self selector@selector(threadNext:) object:nil];
    [_hdlThreadNext start];
}

线程是这样的:

- (void)threadNext:(id)sender{
    @autoreleasepool{
         BOOL success;

         [CATransation begin];

         /* send username and password and decrypt responce */
         ... // balabala... and set "success"

         if (success){
             [[self view] removeFromSuperview];
             [self sendMessageToSuperview:@"Add Next View"];    // Superview's method, telling superview to call addSubview: to add another subview
         }
         else{
             /* Nothing special to do */
         }

         [CATransation commit];
    }
}

4> 子视图切换到另一个。它的组合视图似乎还可以:image for combo view
但是其他 NSTextView 的蓝色边框不会再出现了!

有没有人知道我做错了什么?非常感谢!

【问题讨论】:

    标签: xcode macos nsthread nstextfield


    【解决方案1】:

    也许我的编程完全错误,所以很少有人遇到这个问题。
    我找到了解决这个问题的方法。我提到所有(或大部分?)图形更改应该在博客的主线程中完成。因此,我将“if(success)”更改为:

    if(success){
        dispatch_async(dispatch_get_main_queue()' ^{
            [[self view] removeFromSuperview];
            [self sendMessageToSuperview:@"Add Next View"];
        });
    }
    

    解决了,对焦环又回来了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多