iPhone Отключение кнопок UIActionSheet - PullRequest
8 голосов
/ 13 апреля 2009

Я хочу отключить кнопки в листе UIAction и включить их после выполнения определенного условия. Как мне этого добиться? Есть идеи?

Ответы [ 7 ]

8 голосов
/ 14 декабря 2009

Я обнаружил, что ответ Крейга у меня не работает (на ОС 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 в будущем выпуске ОС.

2 голосов
/ 13 апреля 2009

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

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

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

1 голос
/ 19 мая 2011

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

т.е. Настройте кнопки UIB для включения / выключения после возникновения определенных условий.

// Instantiate once within a method
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];

ПРИМЕЧАНИЕ. Это прекрасно работало в предыдущем приложении, которое я создал.

1 голос
/ 14 декабря 2009

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

0 голосов
/ 01 декабря 2011

Вы можете попробовать [actionSheet valueForKey: @ "_ buttons"] в вашем UIActionSheetDelegate, например так:

- (void)willPresentActionSheet:(UIActionSheet *)actionSheet
{
    for (UIButton *btn in [actionSheet valueForKey:@"_buttons"])
    {
        [btn setBackgroundImage:[UIImage imageNamed:@"btnActionSheetUp.png"]     forState:UIControlStateNormal];
        [btn setBackgroundImage:[UIImage imageNamed:@"btnActionSheetDown.png"] forState:UIControlStateHighlighted];
    }
}

Надеюсь, это не изменится в будущих выпусках SDK.

0 голосов
/ 18 октября 2010

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

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

Мой случай связан с наличием пользовательского значка в пользовательской нижней панели и нажатием на него представлены следующие варианты:

  • при входе в систему
    • Мой профиль
    • Выйти
  • если не авторизован
    • Войти
0 голосов
/ 06 июля 2009

Если вы добавите представление к листу действий, оно не получит никакого события. Вам нужно посмотреть на суперпредставление листа действий.

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

- (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];

}

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