【问题标题】:How to disable NSBox from code如何从代码中禁用 NSBox
【发布时间】:2012-05-05 14:38:19
【问题描述】:

我在 NSBox 中放置了几个控件(按钮、文本字段、...)。是否可以禁用用户无法访问控件的 NSBox(意味着无法单击按钮或在文本字段中写入)?

nsview 怎么样?

【问题讨论】:

    标签: cocoa nsbox


    【解决方案1】:

    NSBox 基本上只是一个带边框的视图,没有办法“禁用”它。如果要禁用框中的所有控件,可以循环遍历其所有子视图并禁用它们,或者我这样做的另一种方法是在整个框上放置一个覆盖视图并覆盖该覆盖中的 mouseDown(以捕获任何 mouseDown 事件,因此它们不会在事件循环中排队)。您还可以将叠加层设置为半透明的白色,使框具有禁用外观。

    【讨论】:

      【解决方案2】:

      或者,如果你有一个自定义的 NSBox,你可以覆盖 NSView 的 -hitTest:(有条件地)

      - (NSView *)hitTest:(NSPoint)aPoint {
          if (!enabled) return nil;
          else return [super hitTest:aPoint];
      }
      

      阻止窗口向所有子视图发送事件。

      为了提供视觉反馈,在自定义 NSBox 的 -drawRect 方法中有条件地绘制某种叠加层会起作用。

      【讨论】:

      • 这不会向用户提供任何视觉反馈,是吗?我认为这可能会令人困惑(除非您要发出警报或其他东西)。
      • 不,没有视觉反馈(除非你做了一些自定义绘图),所以你的答案可能对大多数用例更好,我只是想我会提供一个替代方案。
      【解决方案3】:

      是的,你只需要查看 NSBox 的子视图,它通常只是一个 NSView,然后你的实际控件将在它的子视图下。

      这是我编写的一个快速 C 风格函数,用于启用/禁用最常见的 UI 控件,包括 NSBox...

      void SetObjEnabled(NSObject * Obj, bool Enabled)
      {
          //Universal way to enable/disable a UI object, including NSBox contents
      
          NSControl * C = (NSControl *)Obj;
      
          if([C respondsToSelector:@selector(setEnabled:)])
              [C setEnabled:Enabled];
      
          if([C.className compare:@"NSTextField"] == NSOrderedSame)
          {
              NSTextField * Ct = (NSTextField*)C;
              if(!Enabled)
                  [Ct setTextColor:[NSColor disabledControlTextColor]];
              else //Enabled
                  [Ct setTextColor:[NSColor controlTextColor]];
          }
          else if([C.className compare:@"NSBox"] == NSOrderedSame)
          {
              NSBox * Cb = (NSBox*)C;
      
              //There is typically just one subview at this level
              for(NSView * Sub in Cb.subviews)
              {
                  //Here is where we'll get the actual objects within the NSBox
                  for(NSView * SubSub in Sub.subviews)
                      SetObjEnabled(SubSub, Enabled);
              }
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-23
        • 2011-06-26
        • 1970-01-01
        • 2013-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多