在OS X應用程序中,我在滾動視圖內部有各種文本字段,按鈕和其他控件。有沒有辦法一次禁用滾動視圖內的元素?Cocoa:禁用視圖中所有控件的最佳方法
我想避免在每個項目上調用setEnabled:
,以便稍後在滾動視圖中添加更多控件時維護更容易。
我想強調這是針對OS X應用程序的,因此在iOS中工作的技術不一定適用於此。
在OS X應用程序中,我在滾動視圖內部有各種文本字段,按鈕和其他控件。有沒有辦法一次禁用滾動視圖內的元素?Cocoa:禁用視圖中所有控件的最佳方法
我想避免在每個項目上調用setEnabled:
,以便稍後在滾動視圖中添加更多控件時維護更容易。
我想強調這是針對OS X應用程序的,因此在iOS中工作的技術不一定適用於此。
您可以遍歷所有內容視圖的所有subviews
,並在所有這些視圖上調用setEnabled:
。這可能會通過禁用某些內部視圖來破壞滾動視圖,因此不要遍歷滾動視圖本身的subview
屬性。要防止在沒有啓用屬性的視圖上調用setEnabled:
,請使用respondsToSelector:@selector(setEnabled:)
進行檢查。
我想用一個屬性來實現在視圖控制器(BOOL稱爲userInteractionEnabled或類似的東西),然後檢查它在視圖控制器相應的委託方法:
- (BOOL)textFieldShouldBeginEditing:(UITextfield *)txtField {
if (!self.userInteractionEnabled) {
return NO;
}
// Your other logic
return YES;
}
爲您使用的每種控件類型執行此操作。
您可以使用綁定輕鬆完成此任務。您必須在XIB中擁有您的控制器類的實例,以執行以下步驟,但該技術不需要此操作 - 如果您願意,可以以編程方式進行設置。
BOOL
屬性添加到您的控制器類,說scrollItemsEnabled
Enabled
結合scrollItemsEnabled
財產控制器類的實例現在爲了記錄的緣故,這裏是一個的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];
希望它能幫助。
謝謝噸,這正是我正在尋找。 +99我希望。 +1就夠了。 – 2014-05-14 11:20:24
很高興幫助大衛。謝謝! – 2014-05-26 08:06:46
這是我在項目中使用的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
您可以向uiview添加一個類別,並製作一個將屬性向下傳遞給層次結構的方法。 – govi 2012-03-08 14:54:05