Какао: лучший способ отключить все элементы управления в представлении - PullRequest
9 голосов
/ 08 марта 2012

В приложении OS X у меня есть различные текстовые поля, кнопки и другие элементы управления внутри прокрутки.Есть ли способ отключить элементы в представлении прокрутки все сразу?

Я бы хотел избежать вызова setEnabled: для каждого элемента, чтобы облегчить обслуживание, если позже я захочу добавить дополнительные элементы управления в представление прокрутки.

Я бы хотелЯ хотел бы подчеркнуть, что это для приложения OS X, поэтому методы, которые работают в iOS, не обязательно применяются здесь.

Ответы [ 6 ]

5 голосов
/ 06 мая 2012

Ради записи, вот категория 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];

Надеюсь, это поможет.

5 голосов
/ 09 марта 2012

Вы можете легко выполнять подобные задачи с помощью привязок. У вас должен быть экземпляр класса вашего контроллера в вашей XIB для следующих шагов, но метод не требует этого - вы можете выполнить настройку программно, если пожелаете.

  1. Добавьте свойство BOOL в ваш класс контроллера, скажем scrollItemsEnabled
  2. В панели IB / Designer Xcode 4 откройте свой XIB
  3. Для каждого контроллера, который вы хотите включить / отключить, выберите его и на панели привязок ссылки инспектора привязайте Enabled к свойству scrollItemsEnabled экземпляра класса контроллера
  4. Теперь в настройках вашего кода свойство будет включать / отключать все элементы вместе
4 голосов
/ 08 марта 2012

Вы можете перебирать все subviews представления содержимого и вызывать setEnabled: для всех из них. Это может нарушить представление прокрутки, отключив некоторое внутреннее представление, поэтому не выполняйте итерации со свойством subview самого представления прокрутки. Чтобы запретить вызов setEnabled: для представлений, у которых нет включенного свойства, используйте respondsToSelector:@selector(setEnabled:) для проверки.

2 голосов
/ 17 декабря 2016

Вот категория 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
0 голосов
/ 08 марта 2012

Мне нравится делать это в контроллере представления с одним свойством (BOOL с именем userInteractionEnabled или чем-то подобным), а затем проверять его в соответствующих методах делегата в контроллере представления:

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

      return YES;
 }

Делайте это для каждого типа элемента управления, который вы используете.

0 голосов
/ 08 марта 2012

Попробуйте это

[scrollView setUserInteractionEnabled:NO];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...