27

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

4

5 に答える 5

28

はい。サブクラス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:文書化されていないため、それがあなたに適しているかどうかはわかりません。

于 2010-01-12T20:06:53.887 に答える
3

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

于 2015-08-11T03:55:11.850 に答える
3

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

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

于 2010-01-12T20:39:33.223 に答える
1
#import "MLAlertView.h"

@implementation MLAlertView


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

-(void)dismissNow:(NSInteger)buttonIndex  {
     [super dismissWithClickedButtonIndex:buttonIndex animated:YES];
}
于 2014-12-12T06:53:28.753 に答える
1

警告

一部の情報源から、このプロセスに従って拒否されたアプリはほとんどないと聞いています。私の場合、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
}
于 2013-04-10T13:09:40.917 に答える