Подтвердить что ты не робот

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

По-моему: Нет оснований держать alertView. Даже если вы хотите сохранить его, просто подумайте о "повторном показе" его, сохранив ссылку, а затем вызовите [alertView show] == > НЕТ НУЖДАЕТСЯ В SUBCLASS НИЧЕГО. Хорошие новости, да?

Ответ 4

Внимание

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

Ответ 5

#import "MLAlertView.h"

@implementation MLAlertView


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

-(void)dismissNow:(NSInteger)buttonIndex  {
     [super dismissWithClickedButtonIndex:buttonIndex animated:YES];
}