3

UIAlertViewsこんにちは、クラス内でいくつか見せたいと思いNSObjectます。このような通常の方法を実装するだけです

 if (data != nil)
{
    @try {
        NSDictionary *result=[data JSONValue];
        if ([[result valueForKey:@"success"] integerValue]==1) {

            NSMutableArray *friendsPlaylistArray=[result valueForKey:@"comments"];
            return friendsPlaylistArray;
        }
        else
        {
            UIAlertView *alertFriendsPlaylist=[[UIAlertView alloc] initWithTitle:@"Thala Live" message:[[result valueForKey:@"errors"] valueForKey:@"errMessage"] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];

            [alertFriendsPlaylist show];
        }

しかし、これは私に警告を与えることはありません。何故ですか?どうすれば正しい方法で実装できますか?

4

4 に答える 4

2

ビュー コントローラーがない場合に UIAlertController を使用してアラート ビューを表示する方法。説明

はい、UIViewController クラスでのみ UIAlertController を使用できます。では、NSObject クラスでそれを行うにはどうすればよいでしょうか。上記の説明リンクが表示されれば、答えが得られます。上記の説明を要約すると、現在のウィンドウの上に新しいウィンドウを作成します。この新しいウィンドウは、アラートを表示する 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 *msg=@“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];

                });
于 2016-04-04T06:23:03.530 に答える
1

UIKit要素はメインスレッドから操作する必要があります。関数が他のスレッドから実行された場合、アラートが表示されない可能性があります。

これを試して、NSObjectクラスでメソッドを書き、

-(void) showAlert {
    UIAlertView *alertFriendsPlaylist=[[UIAlertView alloc] initWithTitle:@"Thala Live" message:[[result valueForKey:@"errors"] valueForKey:@"errMessage"] delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];
    [alertFriendsPlaylist show];
}

次に、これを呼び出す必要がある場合は、このように呼び出します。

[self performSelectorOnMainThread:@selector(showAlert) withObject:nil waitUntilDone:NO];

これにより、メイン スレッドでそのメソッドが実行さNSObjectれ、アラート ビューが表示されます。

それが役立つことを願っています!

于 2013-09-20T11:16:49.720 に答える
0

そのコードをメイン スレッドから実行していないように見えます。つまり、簡単な修正は[alertFriendsPlaylist show];メイン スレッドでリダイレクトすることです。試してみてください:

dispatch_async(dispatch_get_main_queue(), ^{ 
   [alertFriendsPlaylist show];
});
于 2013-09-20T11:16:53.773 に答える
-1

ViewController.h

#import <UIKit/UIKit.h>
#import "ss.h"  // Custom Object file
@interface ViewController : UIViewController
{
    //ss *scv;
}
@property(nonatomic,retain)ss *scv;
@end

ViewController.m

@synthesize scv;
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    scv=[[ss alloc]init];
    [scv gt];

}

ss.h

#import <Foundation/Foundation.h>
@class ss;
@interface ss : NSObject
-(void)gt;
@end

ss.m

#import "ss.h"
@implementation ss
-(void)gt
{
    UIAlertView *alertFriendsPlaylist=[[UIAlertView alloc] initWithTitle:@"Thala Live" message:@"GGOD" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil];

    [alertFriendsPlaylist show];
}
@end

アラートを受け取りましたここに画像の説明を入力

于 2013-09-20T11:22:56.000 に答える