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