web-dev-qa-db-ja.com

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が何のために設計されたのかわかります。しかし、私の目的は、アプリが終了する前に、ユーザーがテキストを貼り付けボードにコピーできるようにすることです(これは、アラートビューが閉じられたときに自動的に行われます。

27
Corey Floyd

はい。サブクラス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:をバイパスするデリゲートへのメソッドですが、文書化されていないなので、それがあなたに適しているかどうかはわかりません。

27
kennytm

willPresentAlertView:didPresentAlertView:alertView:willDismissWithButtonIndex:、およびalertView:didDismissWithButtonIndex:は、UIAlertViewのアニメーションの開始と終了を追跡するためのものです。

UIAlertViewのアニメーションを追跡する必要のないアプリケーションは、単にalertView:clickedButtonAtIndex:を使用できます。そのメソッドのドキュメントには、「このメソッドが呼び出された後、レシーバーは自動的に閉じられます」と書かれています。

3
Darren

私の意見では:alertViewを維持する理由はありません。保持したい場合でも、参照を保持して「再表示」することを考えてから、[alertView show] ==> サブクラスは必要ありませんを呼び出します。良いニュースですね

2
samthui7

[〜#〜]警告[〜#〜]

いくつかの情報源から、このプロセスの後に拒否されたアプリはほとんどないと聞いています。 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
}
1
Vaibhav Saran
#import "MLAlertView.h"

@implementation MLAlertView


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

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