2011-12-24 12 views
0

UIActionSheetのメソッドshowFromTabBar:を使用して、アクションシートを表示しています。デリゲートメソッドactionSheet:clickedButtonAtIndex:では、現在のUITabBarItemのタイトルを[email protected]"New Title"と呼びます。selfは現在のTabBarControllerのViewControllerです。私がこれを行うと、TabBarItemのタイトルは空の文字列( "")になります。アクションシートのdelegate-methodにNSNotificationを投稿し、同じ方法で通知ハンドラメソッドのタイトルを変更しようとすると、アプリケーションがクラッシュします(コンソールに出力されません)。しかし、代わりに[self.tabBarItem performSelectorOnMainThread:@selector(setTitle:) withObject:@"New Title" waitUntilDone:NO]を呼び出すと、両方のバリアントで動作します。これはSDKのバグですね。actionSheet-delegateメソッドでtabBarItem-titleを設定できません

答えて

1

基本的には、へのコール中にUIActionSheetがメインスレッド(または少なくともそれとのやりとり)をブロックしています。これはおそらくUITabBarによって/から提示された結果です。

setTitle:タスクは、performSelectorOnMainThread:withObject:waitUntilDone:NOコールで後で完了するようにスケジュールしています。そして、これはうまくいくでしょう。

dispatch_async(dispatch_get_main_queue(), ^{ 
    self.tabBarItem.title = @"New Title"; 
}); 

そして、その構文はそれは素晴らしいことだ、より良いあなたにぴったりの場合:そうのようなブロックを使用してと同一でない場合は、非常に似ています。

しかし、より簡単な方法があります。デリゲートメソッドactionSheet:didDismissWithButtonIndex:を使用してください。UIActionSheetがすでに終了したときに、このメソッドが呼び出され、他の呼び出しをブロックしなくなります。

+0

+1です。これはdidDismissWithButtonIndex:メソッドで機能するためです。しかし、あなたの "ブロックされたメインスレッド"の説明は満足のいくものではありません。 「ブロックされた」という言葉で正確に何を意味し、なぜそれが単純なタイトルプロパティの(直接の)設定を禁止するのですか? –

関連する問題