Можно ли НЕ отклонить UIAlertView

Протокол UIAlertviewDelegate имеет несколько необязательных методов, в том числе:

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

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

Должен ли я создать подкласс для этого?

Почему протокол UIAlertViewDelegate имеет:

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex;
- (void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex

И

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex;

Если бы он не поддерживал неотклонение представления предупреждения при каждом нажатии кнопки?

Краткое отступление: я понимаю, для чего был разработан UIAlertView. Но моя цель — позволить пользователю скопировать некоторый текст на доску для вставки перед выходом из приложения (что происходит автоматически, когда вид предупреждения закрывается.


person Corey Floyd    schedule 12.01.2010    source источник


Ответы (4)


да. Подкласс UIAlertView, а затем перегрузите -dismissWithClickedButtonIndex:animated:, например.

@implementation MyAlertView 
-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {
   if (buttonIndex should not dismiss the alert)
      return;
   [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
}
@end

Неофициально вы можете определить

-(void)alertSheet:(UIAlertSheet*)sheet buttonClicked:(id)button;

метод делегату, который заставит его обойти -dismissWithClickedButtonIndex:animated:, но он недокументирован, поэтому я не знаю, подходит ли он вам.

person kennytm    schedule 12.01.2010
comment
Это то, что я делаю сейчас. Но из-за доступных методов делегирования кажется, что мне не нужно. Ну что ж… - person Corey Floyd; 12.01.2010
comment
Хм… интересно. Жаль, что они отказались от использования недокументированных API. - person Corey Floyd; 13.01.2010
comment
Но как после этого отклонить это пользовательское оповещение с помощью другой кнопки. или из кода? Я вызываю метод rejectWithClickedButtonIndex:, но alertView не исчезает. - person Gusev Andrey; 24.01.2012
comment
К сожалению, это больше не работает в iOS 7. dismissWithClickedButtonIndex:animated: больше не вызывается после обратных вызовов UIAlertViewDelegate, поэтому переопределение с пустой реализацией метода больше не является решением. - person lukestringer90; 28.12.2013
comment
есть ли альтернатива для ios 7? - person lukas; 06.02.2014
comment
Как мне сделать то же самое на siwft? - person Amg91; 23.11.2018

willPresentAlertView:, didPresentAlertView:, alertView:willDismissWithButtonIndex: и alertView:didDismissWithButtonIndex: предназначены для отслеживания начала и конца анимации UIAlertView.

Приложения, которым не нужно отслеживать анимацию UIAlertView, могут просто использовать alertView:clickedButtonAtIndex:. В документах для этого метода говорится, что «получатель автоматически отключается после вызова этого метода».

person Darren    schedule 12.01.2010
comment
Спасибо, я пропустил последний фрагмент текста в документах. По-прежнему кажется излишним иметь этот дополнительный метод, поскольку он по сути такой же, как willPresentAlertView… - person Corey Floyd; 13.01.2010
comment
@Darren: Большое спасибо в ios7 alertView:willDismissWithButtonIndex: этот метод вызывается дважды. но ваше решение спасло мой день .. - person TamilKing; 20.02.2014

На мой взгляд: нет причин сохранять alertView. Даже если вы хотите сохранить его, просто подумайте о том, чтобы «перепоказать» его, сохранив ссылку, а затем вызовите [alertView show] ==> НЕ НУЖНО НИЧЕГО ПОДКЛАССИРОВАТЬ. Хорошие новости, да?

person samthui7    schedule 11.08.2015
comment
Это работает. Хотя есть небольшое мерцание, когда вы повторно отображаете всплывающее окно. - person RajV; 17.12.2015

ВНИМАНИЕ

Из некоторых источников я слышал, что несколько приложений были отклонены после этого процесса. Мне повезло в моем случае во время iOS6, поэтому я показываю код здесь. Используйте на свой страх и риск :-/

Подклассы - лучший способ. Создайте флаг bool для оповещения, должно оставаться или нет.

Это подкласс UIAlertView

//
//  UICustomAlertView.h
//

#import <UIKit/UIKit.h>

@interface UICustomAlertView : UIAlertView
{
    
}
@property(nonatomic, assign) BOOL dontDisppear;
@end

//
//  UICustomAlertView.m
//

#import "UICustomAlertView.h"

@implementation UICustomAlertView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

-(void)dismissWithClickedButtonIndex:(NSInteger)buttonIndex animated:(BOOL)animated {

    if(self.dontDisppear)
        return;
    [super dismissWithClickedButtonIndex:buttonIndex animated:animated];
}
@end

И вот как я использовал это в своем коде

if(![txtUsername.text isEqualToString:@"admin"] && ![txtPassword.text isEqualToString:@"admin"])
{
     alertLogin.dontDisppear = YES;
     alertLogin.message = NSLocalizedString(@"my_alert", nil);
}
else
{
     alertLogin.dontDisppear = NO;
     // proceed
}
person Vaibhav Saran    schedule 10.04.2013
comment
Я поставил -1 по причине "The UIAlertView class is intended to be used as-is and does not support subclassing. The view hierarchy for this class is private and must not be modified" в developer.apple.com/library/ios/documentation/uikit/reference/, поэтому реализация вашего способа будет противоречить процессу документации и проверки Apple, поэтому их приложение будет отклонено. Так было уже несколько лет, поэтому на момент вашего ответа это будет неправильный ответ. - person Popeye; 29.05.2014
comment
Может быть, но мое приложение одобрили в прошлом году (iOS 6). - person Vaibhav Saran; 30.05.2014
comment
Извините, но это не значит, что это правильно. Я отправил приложение до того, как узнал об этом, и оно прошло первоначальный процесс проверки, а затем было отклонено, когда я отправил обновление. Группа проверки Apple — всего лишь люди, они могут что-то пропустить. Я знаю, хотя они более строги с iOS 7. Однако мой -1 был чисто потому, что этот ответ противоречит документации Apple, и вы не предупреждаете об этом. Если вы предупредите об этом, я с радостью удалю свой -1 - person Popeye; 30.05.2014
comment
Я доволен тем, что удалил свой -1 - person Popeye; 30.05.2014