#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’.