【问题标题】:Cocoa: best way to disable all controls in a viewCocoa:禁用视图中所有控件的最佳方法
【发布时间】:2012-03-26 00:48:39
【问题描述】:

在 OS X 应用程序中,我在滚动视图中拥有各种文本字段、按钮和其他控件。有没有办法一次性禁用滚动视图中的元素?

我想避免在每个项目上调用setEnabled:,这样如果我以后想向滚动视图添加更多控件,维护会更容易。

我想强调的是,这是针对 OS X 应用程序的,因此适用于 iOS 的技术不一定适用于此。

【问题讨论】:

  • 您可以向 uiview 添加一个类别,并创建一个将属性沿层次结构向下传播的方法。

标签: objective-c macos cocoa user-interface


【解决方案1】:

为了记录,这里是我在我的 Cocoa 应用程序中使用的一个 NSView 类别:
https://github.com/ardalahmet/DisableSubviews

它使一次启用/禁用子视图变得容易,并且还提供了很大的灵活性。
您可以拨打此类电话:

[scrollView disableSubviews:YES];

[self.window.contentView disableSubviews:YES
                                  ofType:[NSTextField class]];

[someView disableSubviews:YES
                   filter:^BOOL (NSView *v) {
                       return [v isKindOfClass:[NSTextField class]] &&
                              (((NSTextField *) v).stringValue.length < 1);
                   }];

[otherView disableSubviews:disable
                  startTag:3
                    endTag:7];

希望对你有帮助。

【讨论】:

  • 谢谢吨,这正是我要找的。 +99 我希望。 +1 就足够了。
  • 很高兴它帮助了大卫。谢谢!
【解决方案2】:

您可以使用绑定轻松完成此类任务。您必须在您的 XIB 中有一个控制器类的实例才能执行以下步骤,但该技术不需要这样做 - 如果您愿意,您可以通过编程方式进行设置。

  1. BOOL 属性添加到您的控制器类,例如scrollItemsEnabled
  2. 在 Xcode 4 的 IB/设计器窗格中打开您的 XIB
  3. 对于您希望启用/禁用的每个控制器,选择它,然后在检查器的绑定窗格中将 Enabled 绑定链接到控制器类实例的 scrollItemsEnabled 属性
  4. 现在在您的代码设置中,该属性将同时启用/禁用所有项目

【讨论】:

    【解决方案3】:

    您可以遍历内容视图的所有subviews,并在所有这些上调用setEnabled:。这可能会通过禁用某些内部视图来破坏滚动视图,因此不要迭代滚动视图本身的 subview 属性。要防止在没有启用属性的视图上调用 setEnabled:,请使用 respondsToSelector:@selector(setEnabled:) 进行检查。

    【讨论】:

      【解决方案4】:

      这是我在项目中使用的 NSView 类别,效果很好。

      //Code for NSView+Custom.h
      #import <Cocoa/Cocoa.h>
      @interface NSView (Custom)
          -(void) setEnabled:(BOOL) isEnabled;
      @end
      
      //Code for NSView+Custom.m
      
      #import "NSView+Custom.h"
      
      @implementation NSView (Custom)
      
      -(void) setEnabled:(BOOL) isEnabled{
      
          for (NSView* subView in self.subviews) {
      
              if ([subView isKindOfClass:[NSControl class]]) {
      
                  [(NSControl*)subView setEnabled:isEnabled];
              }else  if ([subView isKindOfClass:[NSView class]]) {
      
                  [subView setEnabled:isEnabled];
              }
          }
      }
      
      @end
      

      【讨论】:

        【解决方案5】:

        我喜欢在视图控制器中使用一个属性(称为 userInteractionEnabled 的 BOOL 或类似的东西)执行此操作,然后在视图控制器中的适当委托方法中检查它:

         - (BOOL)textFieldShouldBeginEditing:(UITextfield *)txtField {
              if (!self.userInteractionEnabled) {
                   return NO;
              }
              // Your other logic
        
              return YES;
         }
        

        为您使用的每种控件类型执行此操作。

        【讨论】:

        • UI... 不适用于 OS X 并且 NSViews 没有 userInteractionEnabled 属性
        • @ArnaudLays 虽然是这样,但这仅用于示例目的。我所做的是创建属性(正如我所说,你调用或类似的东西)并从适当的委托方法检查它(正如我在 4-1/2 年前写这个答案时所说的那样......)
        【解决方案6】:

        试试这个

        [scrollView setUserInteractionEnabled:NO];
        

        【讨论】:

        • 不幸的是,您不仅可以通过这种方式禁用控件:还可以禁用滚动。这可能会也可能不会被接受。
        • userInteractionEnabled 在 NSView 上不存在
        • 它在 UIView 上(这是 UIScrollView 继承的)。
        • @Inafziger - UIViews 适用于 iOS .. 这个问题适用于 OS X
        • 啊,真的!我错过了,对不起!
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多