Создание подклассов UIAlertView - PullRequest
1 голос
/ 29 ноября 2011

Я пытаюсь создать подкласс UIAlertView для лучшей обработки состояний ошибок в моем приложении.Проблема в том, что с параметром otherButtonTitles nil прекращается, когда я создаю свой подкласс, он выбирает только первую строку в списке, а не все строки

+ (ErrorAlertView *)displayErrorAlertViewWithTitle:(NSString *)title 
                                           message:(NSString *)message 
                                          delegate:(id<UIAlertViewDelegate>)delegate 
                                     errorDelegate:(id<ErrorAlertViewDelegate>)errorDelegate
                                 cancelButtonTitle:(NSString *)cancelButtonTitle 
                                        displayNow:(BOOL)displayNow
                                               tag:(NSUInteger)tag
                                 otherButtonTitles:(NSString *)otherButtonTitles, ...;

{

  ErrorAlertView *errorAlertView = [[ErrorAlertView alloc]  initWithTitle:title 
                                                                  message:message 
                                                                 delegate:delegate 
                                                        cancelButtonTitle:cancelButtonTitle 
                                                        otherButtonTitles:otherButtonTitles, nil];


  errorAlertView.errorDelegate = errorDelegate;
  errorAlertView.tag = tag;

  if (displayNow) {

    [errorAlertView show];

  }

  return [errorAlertView autorelease];


}

Если явыполните следующий вызов вышеуказанного метода:

[ErrorAlertView displayErrorAlertViewWithTitle:[self noInternetConnectionAlertViewTitle] 
                                           message:[self noInternetConnectionAlertViewMessage] 
                                          delegate:self 
                                     errorDelegate:errorDelegate 
                                 cancelButtonTitle:@"OK" 
                                        displayNow:YES 
                                               tag:ErrorAlertTagInternetConnectionError 
                                 @"Try again",@"Setting", nil];

UIAlertView отображается только с отображаемой кнопкой @ «Попробовать еще раз».

Ответы [ 3 ]

14 голосов
/ 29 ноября 2011

Из справочника по классам UIAlertView

Примечания по подклассам

Класс UIAlertView предназначен для использования как есть и предназначенне поддерживает подклассы.Иерархия представлений для этого класса является закрытой и не должна быть изменена.

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

5 голосов
/ 29 ноября 2011

Вы не можете отправить переменный набор таких параметров.

Когда я подклассифицировал UIAlertView, я сделал это:

va_list args;
va_start(args, otherButtonTitles);
for (NSString *anOtherButtonTitle = otherButtonTitles; anOtherButtonTitle != nil; anOtherButtonTitle = va_arg(args, NSString*)) {
    [self addButtonWithTitle:anOtherButtonTitle];
}

В качестве альтернативы, вы можете создать вариант вашей функции, которыйпринимает va_list в качестве (единственного) параметра, а затем запускает приведенный выше код.

Как правило, при написании функции с переменными значениями необходимо включить альтернативу для обработки этой возможности.В этом случае Apple предоставляет метод addButtonWithTitle:

1 голос
/ 19 февраля 2015

Вместо того, чтобы создавать подклассы UIAlertView, я предпочитаю создавать простые классы, которые обычно имеют метод show, который принимает параметр делегата.Протокол делегата затем имеет выразительные методы, которые соответствуют доступным опциям.

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

Код обычно выглядит следующим образом (Swift):

@objc protocol DeleteUniverseAlertViewDelegate {
    func deleteUniverseAlertViewDidConfirmDelete(view: DeleteUniverseAlertView)
}


class DeleteUniverseAlertView : NSObject, UIAlertViewDelegate {

    private weak var delegate: DeleteUniverseAlertViewDelegate? = nil

    class func showWithDelegate(delegate: DeleteUniverseAlertViewDelegate) -> DeleteUniverseAlertView {
        let view = DeleteUniverseAlertView()
        view.delegate = delegate
        UIAlertView(title: "Delete universe?", message: "Are you really, really sure about this?", delegate: view, cancelButtonTitle: "Cancel", otherButtonTitles: "Yes, delete!").show()
        return view
    }

    func alertView(alertView: UIAlertView, clickedButtonAtIndex buttonIndex: Int) {
        if (buttonIndex > 0) {
            delegate?.deleteUniverseAlertViewDidConfirmDelete(self)
        }
    }
}

Когда вам нужно показать это предупреждение, просто внедрите протокол и покажите пользовательское предупреждение, как это (не забывайте сохранять сильную ссылку напредставление оповещения):

deleteAlert = DeletePlaceAlertView.showWithDelegate(self)
...