2

Xcode4.2でiOS5.1アプリケーションを開発しています。さまざまなタブを持つuitablcontrollerがあります。私の問題は、タブがクリックされると、アプリケーションが数秒間「フリーズ」し、本来のコードをすべて実行しますが、UIAlertViewが最初に読み込まれないことです。

viewDidLoadでUIAlertViewを宣言しています。コードスニペットは次のとおりです。

- (void)viewDidLoad
{



NSLog(@"##### VIEW DID LOAD 1 #####");


// Display Alert: Loading

alertView = [[UIAlertView alloc] initWithTitle:@"Loading"
                                       message:@"\n"
                                      delegate:self
                             cancelButtonTitle:nil
                             otherButtonTitles:nil];

UIActivityIndicatorView *spinner = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
spinner.center = CGPointMake(139.5, 75.5); // .5 so it doesn't blur
[alertView addSubview:spinner];
[spinner startAnimating];
[alertView show];

[super viewDidLoad];


NSLog(@"##### VIEW DID LOAD 2 #####");


self.tableView.dataSource = self;
self.tableView.delegate = self;

[self callMainMethod];

}

タブをクリックすると、最初のNSLogがログに表示され、次にmainメソッドが呼び出されたことがわかりますが、UIAlertviewは表示されません。

4

1 に答える 1

1

viewDidLoadが実行されている場合、frame関連するUIViewのサイズがゼロである可能性があります。わかりませんが、UIAlertViewこのゼロサイズのフレームで自分自身を表現しようとしている可能性があります。UIAlertViewで提示するのは意味がありますviewDidAppearか?

が多くの計算能力を消費している場合[self callMainMethod]は、終了するまで表示が更新されない可能性があります。に移動してみてくださいviewDidAppear。UIスレッド、表示が更新されるスレッド、実行するスレッド、viewDidLoadおよびその他すべてのview...メソッドのメイン実行ループが、重いものを開始する前にすべてを完了してアイドル状態になるように、遅延を試みることもできます。処理。実行ループがすべての処理を完了した場合にのみ、実際に表示の更新を開始できます。このような:

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 200000000), dispatch_get_main_queue(), ^{
   [self callMainMethod];
}

そのためのドキュメントはhttp://developer.apple.com/library/ios/#documentation/Performance/Reference/GCD_libdispatch_Ref/Reference/reference.htmlにあります。

その疑いが正しければ、実行UIAlertView中にすべてがしばらくの間死んでしまうだけで、ポップアップをまっすぐに上げる必要がありますcallMainMethod

「ここまでのすべての表示の更新が完了した後でのみ、このブロックをディスパッチする」という書き方を知っていればいいのですが、その方法がわかりません。したがって、上記のディスパッチ呼び出しは、呼び出しを200ミリ秒遅らせる必要がcallMainMethodあります。これは、通常は十分です。

それが機能する場合は、「このメソッドの実行中に表示のフリーズを停止するにはどうすればよいですか」などの別の質問を開始する必要があります。

于 2012-12-03T13:34:28.180 に答える