(iOS / Objective-C) Лучший способ условного добавления разных кнопок в UIActionSheet?

#objective-c #ios #uiactionsheet

#objective-c #iOS #uiactionsheet

Вопрос:

В моем приложении для iOS я представляю UIActionSheet пользователю; однако UIActionSheet должен иметь возможность отображать разные кнопки для разных случаев (например, если пользователь не использует iOS 5, тогда поддержка Twitter недоступна, поэтому не показывайте кнопку «Tweet this»; если AirPrint недоступен, пользователь не может печатать, поэтому не показывайте кнопку «Печать» и т.д.) Прямо сейчас у меня это реализовано в действительно мозге -мертвый стиль, в основном использующий кучу операторов if-then-else (см. Ниже). Есть ли более чистый способ сделать это?

 if(NSClassFromString(@"TWTweetComposeViewController"))  {
    if ([TWTweetComposeViewController canSendTweet]) {
        actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Options", @"Options string")
                                                             delegate:self
                                         cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel button")
                                               destructiveButtonTitle:nil
                                         otherButtonTitles:NSLocalizedString(@"Open in Safari", @"Open in Safari button"), NSLocalizedString(@"E-mail to a Friend", @"E-mail to a Friend button"), NSLocalizedString(@"Print", @"Print button"), NSLocalizedString(@"Tweet This", @"Tweet This button"), nil];
    } else {
        actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Options", @"Options string")
                                                  delegate:self
                                         cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel button")
                                    destructiveButtonTitle:nil
                                         otherButtonTitles:NSLocalizedString(@"Open in Safari", @"Open in Safari button"), NSLocalizedString(@"E-mail to a Friend", @"E-mail to a Friend button"), NSLocalizedString(@"Print", @"Print button"), nil];
    }
} else {
    actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Options", @"Options string")
                                              delegate:self
                                     cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel button")
                                destructiveButtonTitle:nil
                                     otherButtonTitles:NSLocalizedString(@"Open in Safari", @"Open in Safari button"), NSLocalizedString(@"E-mail to a Friend", @"E-mail to a Friend button"), NSLocalizedString(@"Print", @"Print button"), nil];
}
  

Ответ №1:

Это примерно так же просто, как вы собираетесь использовать addButtonWithTitle:(NSString *)title :

 actionSheet = [[UIActionSheet alloc] initWithTitle:NSLocalizedString(@"Options", @"Options string")
                                          delegate:self
                                 cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel button")
                            destructiveButtonTitle:nil
                                 otherButtonTitles:NSLocalizedString(@"Open in Safari", @"Open in Safari button"), NSLocalizedString(@"E-mail to a Friend", @"E-mail to a Friend button"), NSLocalizedString(@"Print", @"Print button"), nil];

if(NSClassFromString(@"TWTweetComposeViewController"))
    if ([TWTweetComposeViewController canSendTweet])
        [actionSheet addButtonWithTitle:NSLocalizedString(@"Tweet This", @"Tweet This button")];
  

Комментарии:

1. Это намного лучше, чем то, что у меня было раньше. 🙂 Спасибо!

2. Просто убедитесь, что индексы кнопок по-прежнему соответствуют вашим ожиданиям после добавления дополнительной кнопки.

3. Это оказывается довольно простым. addButtonWithTitle возвращает NSInteger индекс только что добавленной кнопки. Итак, вы можете сделать что-то вроде myButtonIndex = [myActionSheet addButtonWithTitle:@"Some Title"]; ; затем позже в методе делегирования вы можете проверить, есть ли index == myButtonIndex и т.д.

4. Очень приятно — я не осознавал, что addButtonWithTitle возвращает NSInteger. Возможно, мне следует более внимательно прочитать свою документацию. 😀

5. В iOS 7 это приводит к добавлению новой опции после ‘Cancel’.