Как отключить кнопку в UIActionSheet? - PullRequest
8 голосов
/ 22 июля 2009

Мне нужно отключить кнопки в UIActionSheet. после некоторых операций мне нужно включить их снова. Так есть ли способ сделать это.

Спасибо

Ответы [ 6 ]

17 голосов
/ 21 февраля 2012

На основе количества потоков я собрал ответ в категорию на UIActionSheet, добавив метод setButton: toState следующим образом. Надеюсь, это поможет:

@interface UIActionSheet(ButtonState)
- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enbaled;
@end

@implementation UIActionSheet(ButtonState)
- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enabled {
    for (UIView* view in self.subviews)
    {
        if ([view isKindOfClass:[UIButton class]])
        {
            if (buttonIndex == 0) {
                if ([view respondsToSelector:@selector(setEnabled:)])
                {
                    UIButton* button = (UIButton*)view;
                    button.enabled = enabled;
                }
            }
            buttonIndex--;
        }
    }
}
@end
2 голосов
/ 04 ноября 2016

Версия Swift 3.0:

let actionSheet = UIAlertController(title:nil, message:nil, preferredStyle:UIAlertControllerStyle.actionSheet)


actionSheet.addAction(UIAlertAction(title:"Modify", style:UIAlertActionStyle.default, handler:{ action in
    // Do your thing here
}))

let disabledDelete = UIAlertAction(title:"Cannot delete this item", style:UIAlertActionStyle.destructive, handler:nil)
disabledDelete.isEnabled = false
actionSheet.addAction(disabledDelete)

actionSheet.addAction(UIAlertAction(title:"Cancel", style:UIAlertActionStyle.cancel, handler:nil))

self.present(actionSheet, animated:true, completion:nil)
2 голосов
/ 21 августа 2014

Немного улучшенная версия Реувена [увы, я не могу добавить комментарий к его 'потому что у меня пока нет' репутации '...].

@interface UIActionSheet (ButtonEnabled)
- (void)setButtonAtIndex:(NSUInteger)index Enabled:(BOOL)enabled;
@end

@implementation UIActionSheet (ButtonEnabled)
- (void)setButtonAtIndex:(NSUInteger)index Enabled:(BOOL)enabled
{
    for (UIView* view in self.subviews) {
        if ([view isKindOfClass:[UIButton class]]) {
            if (index-- == 0) {
                [(UIButton*)view setEnabled:enabled];
                break;
            }
        }
    }
}
@end

Предыдущий responsedsToSelector: проверка была посторонней, потому что мы уже проверяем UIButton (который является подклассом UIControl, все поддерживают setEnabled]. В соответствии с NSArrays от Apple, я также изменил на AtIndex и NSUInteger, но это в основном косметические.

Общий подход, кажется, работает нормально, но, пожалуйста, обратите внимание, что он предполагает, что порядок подпредставлений кнопок точно соответствует порядку индексов кнопок при создании листа действий, что строго не документировано в любом месте AFAIK.

1 голос
/ 18 мая 2015

Представленные решения не работают на iOS 8. В случае, если кто-то не использует UIAlertController для этого (это рекомендованный Apple способ сделать это), я изменил ответ @ Reuven, чтобы он работал и для iOS 8:

(вторая фаза основана на это ответьте так)

- (void)setButton:(NSInteger)buttonIndex toState:(BOOL)enabled {

    SEL selector = NSSelectorFromString(@"_alertController");

    //iOS 8
    if ([self respondsToSelector:selector]) {

        UIAlertController *alertController = [self valueForKey:@"_alertController"];

        if ([alertController isKindOfClass:[UIAlertController class]]){

            UIAlertAction *action = alertController.actions[buttonIndex];

            [action setEnabled:enabled];

        }

    //iOS 7
    }else{

        for (UIView* view in self.subviews){

            if ([view isMemberOfClass:NSClassFromString(@"UIAlertButton")]) {

                if (buttonIndex == 0) {

                    if ([view respondsToSelector:@selector(setEnabled:)]){

                        UIButton* button = (UIButton*)view;

                        button.enabled = enabled;

                    }

                }

                buttonIndex--;

            }

        }

    }

}
0 голосов
/ 19 мая 2011

Возможно, это немного поздно. Но, как я понял, это создать UIButton (s) и добавить их на UIActionSheet subview. Убедитесь, что эти кнопки расположены сверху и полностью закрывают стандартные кнопки UIActionSheet для замены. Когда UIButton помещается над кнопкой UIActionSheet по умолчанию, его UIResponder имеет приоритет над кнопкой UIActionSheet UIResponder. Таким образом, вы можете отключить и включить эти кнопки так, как вам нравится в вашей логике UIViewController. Это может быть альтернативой доступу к закрытым методам в SDK (как выше - UIThreePartButton), и Apple может отклонить ваше приложение. Я считаю, что это следует руководству Apple.

т.е.

// Instantiate once
if (self.actionSheet==nil)  {
    UIActionSheet *as = [[UIActionSheet alloc] 
                         initWithTitle:@""
                         delegate:self 
                         cancelButtonTitle:@"Cancel"
                         destructiveButtonTitle:@"Load Data"
                         otherButtonTitles:@"Update Data",nil];

    //[actionSheet showInView:self.view];
    self.loadUIButton.frame = CGRectMake(24.0f,25.0f,275.f,46.0f);
    [as addSubview: self.loadUIButton];
    self.updateUIButton.frame = CGRectMake(24.0f,78.0f,275.f,46.0f);
    [as addSubview: self.updateUIButton];
    //[actionSheet addSubview: self.cancelUIButton];
    //[as showFromToolbar: self.navigationController.toolbar];
    self.actionSheet = as;
    [as release];
}
[self.actionSheet showFromToolbar: self.navigationController.toolbar];
0 голосов
/ 22 июля 2009

Эти кнопки являются подпредставлениями UIActionSheet, а их класс - UIThreePartButton

Вы можете получить их и делать все, что вы хотите:

UIActionSheet *a = [[UIActionSheet alloc]initWithTitle:@"" delegate: nil cancelButtonTitle: @"c" destructiveButtonTitle: @"d" otherButtonTitles: @"ot", nil];
    [a showInView: window];

    for(UIView *v in [a subviews])
    {
        if([[v description] hasPrefix: @"<UIThreePartButton"] )
        {
            v.hidden = YES;  //hide
           //((UIButton*)v).enabled = NO;   // disable

        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...