2012-03-08 79 views
7

在OS X應用程序中,我在滾動視圖內部有各種文本字段,按鈕和其他控件。有沒有辦法一次禁用滾動視圖內的元素?Cocoa:禁用視圖中所有控件的最佳方法

我想避免在每個項目上調用setEnabled:,以便稍後在滾動視圖中添加更多控件時維護更容易。

我想強調這是針對OS X應用程序的,因此在iOS中工作的技術不一定適用於此。

+1

您可以向uiview添加一個類別,並製作一個將屬性向下傳遞給層次結構的方法。 – govi 2012-03-08 14:54:05

回答

3

您可以遍歷所有內容視圖的所有subviews,並在所有這些視圖上調用setEnabled:。這可能會通過禁用某些內部視圖來破壞滾動視圖,因此不要遍歷滾動視圖本身的subview屬性。要防止在沒有啓用屬性的視圖上調用setEnabled:,請使用respondsToSelector:@selector(setEnabled:)進行檢查。

-4

試一下這個

[scrollView setUserInteractionEnabled:NO]; 
+0

不幸的是,你不僅僅是這樣禁用控件:你也禁用了滾動。這可能會或可能不會被接受。 – lnafziger 2012-03-08 15:02:24

+5

userInteractionEnabled在NSViews上不存在 – pepsi 2012-03-08 15:28:24

+0

它在UIView上(這是UIScrollView的繼承)。 – lnafziger 2012-03-08 17:19:12

-2

我想用一個屬性來實現在視圖控制器(BOOL稱爲userInteractionEnabled或類似的東西),然後檢查它在視圖控制器相應的委託方法:

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

     return YES; 
} 

爲您使用的每種控件類型執行此操作。

+0

UI ...不適用於OS X 並且NSViews沒有userInteractionEnabled屬性 – nonolays 2016-12-08 17:01:45

+0

@ArnaudLays雖然爲true,但這僅用於舉例目的。我所做的是**創建**屬性(正如我所說,你**打電話給**或類似的**),並從相應的委託方法中檢查它(如我所說的4-1/2幾年前,當我寫這個答案....) – lnafziger 2016-12-08 17:37:35

5

您可以使用綁定輕鬆完成此任務。您必須在XIB中擁有您的控制器類的實例,以執行以下步驟,但該技術不需要此操作 - 如果您願意,可以以編程方式進行設置。

  1. 一個BOOL屬性添加到您的控制器類,說scrollItemsEnabled
  2. 在Xcode中4的IB /設計師窗格中打開您的XIB
  3. 對於每個控制器您希望啓用/禁用選擇它,並在綁定檢查員的窗格在你的代碼鏈接Enabled結合scrollItemsEnabled財產控制器類的實例現在
  4. 設置該屬性將啓用/禁用所有項目一起
5

爲了記錄的緣故,這裏是一個的NSView類我用我的Cocoa程序:
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]; 

希望它能幫助。

+1

謝謝噸,這正是我正在尋找。 +99我希望。 +1就夠了。 – 2014-05-14 11:20:24

+0

很高興幫助大衛。謝謝! – 2014-05-26 08:06:46

2

這是我在項目中使用的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 
相關問題