2012-03-08 24 views
7

Trong ứng dụng OS X, tôi có nhiều trường văn bản, nút và các điều khiển khác bên trong chế độ xem cuộn. Có cách nào để vô hiệu hóa các phần tử bên trong chế độ xem cuộn cùng một lúc không?Cocoa: cách tốt nhất để vô hiệu hóa tất cả các điều khiển trong chế độ xem

Tôi muốn tránh gọi số setEnabled: trên từng mục, để bảo trì dễ dàng hơn nếu tôi muốn thêm nhiều điều khiển hơn vào chế độ xem cuộn sau này.

Tôi muốn nhấn mạnh rằng đây là ứng dụng OS X, vì vậy các kỹ thuật hoạt động trong iOS không nhất thiết phải áp dụng tại đây.

+1

bạn có thể thêm danh mục vào uiview và tạo phương thức truyền thuộc tính xuống cấp bậc. – govi

Trả lời

3

Bạn có thể lặp qua tất cả các subviews của chế độ xem nội dung và gọi setEnabled: trên tất cả chúng. Điều này có thể làm hỏng chế độ xem cuộn bằng cách tắt một số chế độ xem nội bộ, do đó, không lặp lại thuộc tính subview của chính chế độ xem cuộn. Để ngăn chặn gọi số setEnabled: trên các chế độ xem không có thuộc tính được bật, hãy sử dụng respondsToSelector:@selector(setEnabled:) để kiểm tra.

-4

Cố gắng này

[scrollView setUserInteractionEnabled:NO]; 
+0

Thật không may, bạn làm nhiều hơn vô hiệu hóa các điều khiển theo cách này: bạn cũng vô hiệu hóa việc di chuyển. Điều này có thể hoặc có thể không được chấp nhận. – lnafziger

+5

userInteractionEnabled không tồn tại trên NSViews – pepsi

+0

Nó hoạt động trên UIView's (đó là những gì UIScrollView kế thừa từ). – lnafziger

-2

Tôi muốn làm điều này trong bộ điều khiển xem với một tài sản (một BOOL gọi userInteractionEnabled hoặc một cái gì đó tương tự) và sau đó kiểm tra xem nó trong các phương pháp đại biểu thích hợp trong bộ điều khiển xem:

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

     return YES; 
} 

Thực hiện việc này cho từng loại điều khiển mà bạn sử dụng.

+0

Giao diện người dùng ... không dành cho OS X Và NSView không có thuộc tính userInteractionEnabled – nonolays

+0

@ArnaudLays Trong khi đúng, đây chỉ là mục đích ví dụ. Những gì tôi làm là để tạo ** tài sản (như tôi đã nói, bạn ** gọi ** nó ** hoặc một cái gì đó tương tự **) và kiểm tra nó từ các phương thức ủy nhiệm thích hợp (như tôi đã nói 4-1/2 năm trước khi tôi viết câu trả lời này ....) – lnafziger

5

Bạn có thể thực hiện các tác vụ này dễ dàng như vậy với các ràng buộc. Bạn phải có một thể hiện của lớp điều khiển của bạn trong XIB của bạn cho các bước sau đây, nhưng kỹ thuật này không yêu cầu điều này - bạn có thể thực hiện cài đặt theo chương trình nếu bạn muốn.

  1. Thêm một tài sản BOOL đến lớp điều khiển của bạn, nói scrollItemsEnabled
  2. Trong IB/nhà thiết kế cửa sổ của Xcode 4 mở XIB bạn
  3. Đối với mỗi bộ điều khiển mà bạn muốn bật/tắt chọn nó và trong các ràng buộc cửa sổ của thanh tra liên kết các Enabled ràng buộc để scrollItemsEnabled tài sản của cá thể của lớp điều khiển của bạn
  4. Bây giờ trong mã của bạn thiết lập tài sản sẽ cho phép/vô hiệu hóa tất cả các mục cùng
5

Vì lợi ích của các hồ sơ, đây là một thể loại NSView tôi sử dụng trong các ứng dụng Cocoa tôi:
https://github.com/ardalahmet/DisableSubviews

Nó làm cho nó dễ dàng để cho phép/vô hiệu hóa subviews cùng một lúc và nó cũng cung cấp nhiều tính linh hoạt.
Bạn có thể thực hiện các cuộc gọi như vậy:

Hy vọng điều đó sẽ hữu ích.

+1

Cảm ơn tấn, đây chỉ là những gì tôi đang tìm kiếm. +99 Tôi ước +1 phải đủ. –

+0

Vui vì nó đã giúp David. Cảm ơn! –

2

Dưới đây là danh mục NSView tôi đã sử dụng trong dự án hoạt động tốt.

//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 
Các vấn đề liên quan