кнопки iPhone Disabling UIActionSheet

В Vaadin 8 вам нужно использовать интерфейс регистрации для удаления слушателей.

Когда вы добавляете прослушиватель, он возвращает регистрацию:

final Registration registration = select.addValueChangeListener(this::doSomething);

, а затем удаляет его:

registration.remove();

8
задан Peter Hosey 14 December 2009 в 18:43
поделиться

4 ответа

Существуют ли обстоятельства, которые могут измениться, пока лист действий открыт, что может привести к активации кнопки? Если нет, то я думаю, что лучший подход состоит в том, чтобы изменить кнопки, отображаемые на листе, в зависимости от вашего состояния.

В противном случае единственный способ справиться с этим - это перебирать подвиды листа, как сказал Крейг, и искать UIButton объектов. Однако я буду осторожен с использованием заголовка кнопки, поскольку заголовок может (и должен!) Быть локализован для разных языков. Так что сравнение с названием не так уж и надежно. Поскольку вы не создали кнопку, вы на самом деле не знаете, каким будет тег действия или действия каждой кнопки, так что это тоже немного сложно.

По-видимому, кнопки появятся в массиве subviews в порядке, который вы указали для UIActionSheet , но, поскольку это не задокументировано, нет гарантии, что они появятся в этом порядке, или что они будут продолжать появляться в таком порядке в будущих выпусках Cocoa Touch SDK. Из-за этого я бы беспокоился, в основном, о том, что меня исключат из App Store за использование недокументированных функций.

2
ответ дан 5 December 2019 в 14:06
поделиться

Если вы добавите представление к листу действий, оно не получит никаких событий. Вам необходимо перейти к супервизору листа действий.

См. Ниже, как я добавил кнопку с событием касания:

- (void)didPresentActionSheet:(UIActionSheet *)actionSheet{
CGRect rect = CGRectMake(0,0, 320, 480);
UIButton* anImage = [[UIButton alloc] init];
[anImage setTitle:@"GHello worl" forState:UIControlStateNormal];
[anImage setTitle:@"GHello worl dfasd" forState:UIControlStateHighlighted];
[anImage setTitle:@"GHello worl selected" forState:UIControlStateSelected];
//[anImage setBackgroundImage:[UIImage imageNamed:@"photo.png"] forState:UIControlStateNormal];
[anImage addTarget:self action:@selector(buttonClicked:) forControlEvents:UIControlEventTouchUpInside];
rect = CGRectMake(0,0, 320, 220);
anImage.frame =rect;


[actionSheet.superview addSubview:anImage];



[anImage release];

}

0
ответ дан 5 December 2019 в 14:06
поделиться

Я обнаружил, что ответ Крейга у меня не работает (в ОС 3.1). Немного покопавшись, я обнаружил, что подвиды UIActionSheet на самом деле относятся к недокументированному классу UIThreePartButton

В любом случае, это работает для меня (реализовано как часть UIActionSheetDelegete метод)

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet  // before animation and showing view
{
    for (UIView* view in [actionSheet subviews])
    {
        if ([[[view class] description] isEqualToString:@"UIThreePartButton"])
        {
            if ([view respondsToSelector:@selector(title)])
            {
                NSString* title = [view performSelector:@selector(title)];
                if ([title isEqualToString:@"Button 1"] && [view respondsToSelector:@selector(setEnabled:)])
                {
                    [view performSelector:@selector(setEnabled:) withObject:NO];
                }
            }
        }
    }
}

Надеюсь, что это поможет кому-то другому, хотя я бы повторил вопрос Эда Марти о том, не лучше ли вам вообще убрать эти кнопки из списка действий, вместо того, чтобы делать это. Как всегда при использовании недокументированных функций, существует риск отклонения магазина приложений, хотя этот код написан так, чтобы корректно выйти из строя, если Apple снова изменит API в будущей версии ОС.

8
ответ дан 5 December 2019 в 14:06
поделиться

Таблица UIActionSheet не предназначена для настройки. Он должен отображать фактический набор доступных опций. Он не должен изменять доступность кнопки, когда она находится сверху. Просто удалите неиспользуемые кнопки или используйте пользовательский режим просмотра

1
ответ дан 5 December 2019 в 14:06
поделиться