3

iOS 6.1 (エミュレート) および 6.1.3 (物理デバイス) アプリケーションで実行される iOS では、次のコードを使用してビューから UIActionSheet を表示します。

  UIActionSheet *actionCreateNewComment = [[UIActionSheet alloc] initWithTitle:CLocalised(@"EditExistingComment") delegate:self cancelButtonTitle:CLocalised(@"No") destructiveButtonTitle:nil otherButtonTitles: CLocalised(@"Yes"), nil];
[actionCreateNewComment setActionSheetStyle:UIActionSheetStyleBlackOpaque];
[actionCreateNewComment setTag:ActionSheetTagNewComment];
[actionCreateNewComment showFromToolbar:self.navigationController.toolbar];
[actionCreateNewComment release];

ビューはツールバーを次のように設定します。

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:control];
[self setToolbarItems:[NSArray arrayWithObject:item]];

はどこcontrolにありますかUISegmentedControl

ボタン アクションを処理するコードは次のとおりです。

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    bool shouldAddNewComment = buttonIndex == [actionSheet cancelButtonIndex];
    [self navigateToCommentScreen:shouldAddNewComment];
}

このアクション シートが表示されるたびに、ツールバーは「空白」になります。このビューだけでなく、他のビューも同様です。

ワークフローの例を次に示します。 ビュー間のフロー

UIActionSheet を使用せずに Instr から Comment に移動しても、それ以外は同じコードであれば、問題は発生しないことに注意してください。

ここでの問題は、"Instr" ビューでツールバーが空であることです。「リスト」に戻るためにさらに 2 つのビューをポップすると、そのツールバーも空になります。

ListEmpytツールバー

次に、新しいフォームを割り当てて初期化し、それらをプッシュして WO と Instr に戻っても、ツールバーは空のままです。

「概要」ビューを表示する「リスト」ビューからの別のナビゲーション オプションがあります。データに応じて、このビューはツールバーのボタンの有無にかかわらず表示されます。 概要ビューの統計

「Summary Button」と「Summary empty」はどちらも意図されたビューです。Inst と Comment の間を移動する前に UIActionSheet が表示された後、"Summary hidden" が表示されます。しかし、図で「Summary Empty」として表示されている「Summary」ビューに移動すると (データのために意図されたものです)、ツールバーはどこでも再び機能し始めます。または、少なくとも Instr ビューから UIActionSheet を再度表示するまでは。

私の意見では、これにはいくつかの奇妙な点があります。

  • ツールバーが空のビューに移動すると、ツールバーが非表示になり、pic: "SummaryEmpty" を参照すると、ツールバーは他のビューで意図したとおりに表示されます。
  • 同じコードを使用して、アプリケーションの他のビューで問題なくアクション シートを表示します。
  • エミュレートされた iOS 5.1 またはエミュレートされた iOS 5.0 でアプリケーションを実行すると、問題は発生しません。

アクション シートを閉じるとき、またはそれを表示する方法について何かを見逃していませんか?

さらに詳しい情報が必要な場合はお知らせください。

更新: アクション シート ボタン イベントの後に強制的に呼び出し[self setToolbarItems:nil]てから、以前と同じアイテムで更新すると、ツールバーが意図したとおりに表示されます。これは正しい方法とは思えません。

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex更新 2013-05-28: @LOP_Luke のおかげで、「コメント」ビューに移動せずに戻っただけで、ツールバーが再び機能し始めることがわかりました。clickedButtonAtIndexでは、まだコール スタックにあるときに別のビューに移動すると、何らかの問題が発生する可能性がありますか?

Update 2013-05-29 : メソッドを追加すると:

-(void)commentScreenYes{
  [self vanigateToCommentScreen:YES];
}

ボタンのコードを次のように変更します。

-(void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex{
    bool shouldAddNewComment = buttonIndex == [actionSheet cancelButtonIndex];
    if(shouldAddNewComment){
        [self performSelectorOnMainThread:@selector(commentScreenYes) withObject:nil waitUntilDone:NO];
        return;
    }
    [self navigateToCommentScreen:shouldAddNewComment];
}

次に、キャンセルボタンでは機能しますが、はいボタンでは機能しません。キャンセル ボタンは、[はい] ボタンによって「中断」された後も、ツールバーを再び機能させます。(新しいメソッドを追加して) このフローを介して両方のボタンをパイプすると、両方とも機能します。それでも、iOS 5.1 で実行すると、どのフローを選択しても動作します。

4

1 に答える 1

2

この– setToolbarItemsメソッドは、ナビゲーション コントローラーの各子ビュー コントローラーに固有の UIViewController メソッドです。が新しいビュー コントローラーをナビゲーション スタックにプッシュすると仮定すると[self navigateToCommentScreen:shouldAddNewComment]、アクション シートの動作に関係なく、新しいビュー コントローラーのツールバー項目も別の呼び出しとして設定する必要があります。例えば、

-(void) navigateToCommentScreen:(bool) shouldAddComment{
    CommentViewController* viewController = [[CommentViewController alloc] init];

    [self.navigationController pushViewController:viewController animated:YES];

    [viewController setToolbarItems:self.toolbarItems];
}

そうしないと、新しいView Controllerにツールバー項目がなくなり、ツールバーが空白になります。

編集

UISegmented コントロールを備えたツールバーを持つルート ビュー コントローラーを使用して、ナビゲーション コントローラーを作成しました。UIActionSheet デリゲート メソッドを介して新しいビュー コントローラーをナビゲーション スタックにプッシュし、ポップして戻しました。ツールバーは、ルート ビュー コントローラー上での本来の姿でした (セグメント化されたコントロールは、期待どおりにフェードインしました)。それらが消える原因となっているツールバー項目の設定に関して、コントローラーでもっと複雑なことをしているに違いありません。viewController のソース メソッドを見ないと、何が問題なのかを判断するのは困難です。ツールバーの項目を nil に設定したり、空の配列でリセットしたりしていないことを確認してください。

于 2013-05-23T21:15:47.230 に答える