Можно ли НЕ отклонять UIAlertView
-
20-09-2019 - |
Вопрос
Протокол 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];
}