2011-12-26 3 views
7

カスタムNSObjectクラス内でUIAlertViewを動作させるのに苦労しています。私が行った研究では、それは可能でなければならないと思われますが、ここには私が踏んだことがあります。NSObjectでUIAlertViewを使用する

まず、ここに私のコードは次のとおりです。

-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex { 
    NSLog(@"clickedButtonAtIndex: %d", buttonIndex); 
} 

-(void)testAlertView { 
    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"List Contains Items" 
        message:@"List contains items. Remove all items & delete?" 
        delegate:self 
        cancelButtonTitle:@"No" 
        otherButtonTitles:@"Yes", nil]; 
    [alertView show]; 
} 

私は自分にデリゲートを設定した場合、このコードは、すぐに私はボタンをタップするとクラッシュします。 clickedButtonAtIndexが呼び出されることはありません。私は<UIAlertViewDelegate>を使って試してみました。

私は誰かがあなたのUIViewControllerではなく、なぜNSObjectでこれをやっているのか聞いてくるだろうと知っています。主に私はこのコードを分けて、アプリの複数の場所から使うことができるからです。しかし、これは、それが自分自身の上にあるのが理にかなっている、より大きな論理ブロックの小さな断片でもあるからです。

私が間違っていることは何ですか?

おかげで、 リッチ

+0

このコード*はず*仕事、実際に。デリゲートが設定され、警告がクラッシュすると、どこがクラッシュしてスタックトレースがありますか? –

+1

ボタンをタップするとオブジェクトの割り当てが解除されましたか? (オブジェクトは通常代理人を保持しません) –

+0

これは典型的な例です。私はこれを見つめて何時間も過ごし、研究して何かを試してみると成功しなかったので、私は助けを求めることにしました。 1時間も経たないうちに、私はついにそれを理解した。それは、コールビューコントローラでカスタムオブジェクトを作成する方法と関係していたので、フレデリックが提案したように、ボタンをタップした時点で解放されていました。入力仲間に感謝します! – rdfrahm

答えて

8

私はARCを使用して同じ問題を抱えていました。問題の根は同じでした。私のカスタムNSObjectを "強力な"プロパティに入れて、呼び出しオブジェクト(私の場合はUIVIewCOntroller)が存在する限りオブジェクトが存在することを確認して解決しました。したがって、警告ビューの代理人が呼び出されたときに、オブジェクトとデリゲートメソッドは正常に動作します。

+0

あなたは今日、私は数時間、私を救ったかもしれません! – ebi

1

は、強力なプロパティとしてNSObjectのを追加します。

#import "Logout.h" // is NSObject 
. 
. 
. 
@property (nonatomic, strong) Logout *logout; 

次にあなたがNSObjectの中で呼ばれるdelegatemethodsを取得します。

@interface Logout() <UIAlertViewDelegate> 

とあなたの方法で:

ドントはUIAlertViewのデリゲートを登録することを忘れ

UIAlertView *a = [[UIAlertView alloc] initWithTitle:@"title" 
message:@"message" delegate:self cancelButtonTitle:@"cancel" 
otherButtonTitles:@"ok", nil];    

[a show]; 
0

あなたが持っていない場合はUIAlertControllerを使用したアラートビューを表示する方法コントローラを表示します。 Detail description

はい、UIAlertControllerはUIViewControllerクラスでのみ使用できます。それでNSObjectクラスではどうすればいいのですか?上記の説明リンクが表示されている場合は、その答えになります。上の説明の行に要約するには:現在のウィンドウの上に新しいウィンドウを作成します。この新しいウィンドウはalertを表示するviewControllerになります。したがって、このviewControllerを使用すると、メソッド[presentViewController: animated: completion:]を呼び出すことができます。

回答:

dispatch_async(dispatch_get_main_queue(), ^{ 

        UIWindow* window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds]; 

        window.rootViewController = [UIViewController new]; 
        window.windowLevel = UIWindowLevelAlert + 1; 
        NSString *[email protected]“Your mssg"; 
        UIAlertController* alertCtrl = [UIAlertController alertControllerWithTitle:@“Title" message:msg preferredStyle:UIAlertControllerStyleAlert]; 

        [alertCtrl addAction:[UIAlertAction actionWithTitle:NSLocalizedString(@"Yes",@"Generic confirm") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { 

         // do your stuff 
         // very important to hide the window afterwards.      
         window.hidden = YES; 

        }]]; 

        UIAlertAction *cancelAction= [UIAlertAction actionWithTitle:@"cancel" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { 

         window.hidden = YES; 

        }]; 

        [alertCtrl addAction:cancelAction]; 

       //http://stackoverflow.com/questions/25260290/makekeywindow-vs-makekeyandvisible 

        [window makeKeyAndVisible]; //The makeKeyAndVisible message makes a window key, and moves it to be in front of any other windows on its level 
        [window.rootViewController presentViewController:alertCtrl animated:YES completion:nil]; 

       }); 
関連する問題