Можно ли не отклонить UIAlertView - PullRequest
27 голосов
/ 12 января 2010

Протокол 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. Но моя цель - позволить пользователю скопировать некоторый текст на панель вставки до выхода из приложения (что происходит автоматически при закрытии представления предупреждений.

Ответы [ 5 ]

27 голосов
/ 12 января 2010

Да. Подкласс 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:, но он недокументирован , поэтому я не знаю, подходит ли он вам.

3 голосов
/ 12 января 2010

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

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

2 голосов
/ 11 августа 2015

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

1 голос
/ 12 декабря 2014
#import "MLAlertView.h"

@implementation MLAlertView


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

-(void)dismissNow:(NSInteger)buttonIndex  {
     [super dismissWithClickedButtonIndex:buttonIndex animated:YES];
}
1 голос
/ 10 апреля 2013

ПРЕДУПРЕЖДЕНИЕ

Из некоторых источников я слышал, что несколько приложений были отклонены следуя этому процессу. Мне повезло в моем случае во время 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
}
...