Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

На мой взгляд:Нет никаких причин сохранять AlertView.Даже если вы хотите сохранить это, просто подумайте о "повторном показе" этого, сохранив ссылку, затем вызовите [AlertView show] ==> НЕТ НЕОБХОДИМОСТИ ЧТО-ЛИБО ПОДКЛАССИРОВАТЬ.Хорошие новости, да?

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

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

@implementation MLAlertView


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

-(void)dismissNow:(NSInteger)buttonIndex  {
     [super dismissWithClickedButtonIndex:buttonIndex animated:YES];
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top