web-dev-qa-db-ja.com

UIActionSheetキャンセルボタンの奇妙な動作

アクションシートを開くUIBarButtonItemを使用して、ユーザーが何をすべきかを選択できるようにします。 「キャンセル」ボタンをクリックしない限り、すべてが期待どおりに機能します。ボタンのターゲットは、本来あるべき位置から上に移動したように見えます。 「キャンセル」ボタンと「OK」ボタンの中央のどこかをクリックすることでのみ有効にできます。

私は他のアプリケーションのアクションシートで試しましたが、それらはうまく動作するので、それは私の大きな親指ではありません。アクションシートはUIViewControllerで開いています

- (void)showOpenOptions
{
    UIActionSheet *sheet = [[UIActionSheet alloc] 
    initWithTitle:NSLocalizedString(@"Open link in external application?", @"Open in external application")
    delegate:self
    cancelButtonTitle:NSLocalizedString(@"Cancel", @"Cancel")
    destructiveButtonTitle:NSLocalizedString(@"Open Link", @"Open Link")
    otherButtonTitles:nil];

    [sheet showInView:self.view];
    [sheet release];
}
116
nevan king

現在のView Controllerのビューをアクションシートに渡す代わりに、UIActionSheetshowFromTabBar:メソッドを使用します。

正しい方法
これにより、正しいタップ可能領域が得られます。

[actionSheet showFromTabBar:self.tabBarController.tabBar];

間違った方法
これにより、タップ可能な領域が間違った場所に配置されます(タブバーまたはツールバーを使用している場合)。

[actionSheet showInView:self.view];

ツールバーを使用している場合、代わりにshowFromToolbar:メソッドを使用してください。ツールバーへの参照、ほとんどの場合ivarが必要です。

[actionSheet showFromToolbar:self.myToolbar];

私の古い回答動作しますが、ハッキーです:

ちょうど可能な答えを見つけました:

01-Dec-2008 10:22 PM Tom Saxton:このバグについてもう少し調べたところ、タブバーに問題があるようです。

UITabViewControllerの子であるView ControllerからUIActionSheetの[sheet showInView:self.view]を呼び出すと、キャンセルボタンのヒットテストは、タブバーのビューの上にあるUIActionSheetの部分で失敗します。

代わりにUITabBarControllerのビューを渡すと、UIActionSheetは期待どおりに動作します。

注:iPhone OS 2.1以前では、子ビューを渡すとUIActionSheetがタブバーの上部から表示されていましたが、2.2では、タブバーの下部から表示され、タブビューを覆っています。

http://openradar.appspot.com/641078

編集:ビューをタブバーのビューに変更すると正しく動作します

[sheet showInView:self.parentViewController.tabBarController.view];
190
nevan king

here で答えが見つかりました。

使用:[filterActionSheet showInView:[self.view window]];

私はタブバーに到達するためにいくつかの方法を試しましたが、このアプリが設定されている方法は複雑です...

37
driveguy

代わりに使用します:

[sheet showFromTabBar:theTabBar];
22
Corey Floyd

修正方法は次のとおりです:

[actionsheet showInView:[UIApplication sharedApplication].keyWindow];
10
Viggnesh

これを処理する正しい方法は、3つの答えを組み合わせることです。

    [actionSheet showFromTabBar:self.tabBarController.tabBar];

つまり、showFromTabBarを使用し(存在する理由です)、Nathanが指摘したようにparentViewControllerは必要ありません(実際、self.parentViewController.tabBarController.tabBarはnilを返します)。

5
RawMean

参考までに、UIDocumentInteractionControllerのアクションシートがタブバーを踏むのと同じ問題がありました。以下を使用して修正しました。

UIViewController *parentView = [[self parentViewController] parentViewController];
[docController presentOptionsMenuFromRect: rect inView: parentView.view animated:YES];
1
Mickey