0

カスタム UIView サブクラスで UIMenuController を使用しています。これは、最初のレスポンダーになることができcanPerformAction、「削除」アクションでそれを主張できることを意味します。

また、このビューのスーパービュー (カスタム UIView でもあります) でメニュー コントローラーを使用できるようにしたいので、そのスーパービューでファーストレスポンダーとしてマークし、canPerformActionさまざまなアクション (「コピー」と「」この場合は「切る」)。

(最初の) サブビューからメニューを見えるようにすると、削除、コピー、切り取りの 3 つのアクションすべてがメニューに表示されます。デバッガーでは、メニューが表示される前に、両方のビューで呼び出されていることがcanBecomeFirstResponderわかります。canPerformAction

何が起きてる?メニュー コントローラーがファーストレスポンダーになったビューに制限されないのはなぜですか? それとも、これを正しく診断していませんか?

ありがとう。

4

1 に答える 1

1

どのコードを使用していますか?

canPerformAction:withSender:のドキュメントでは、

このメソッドのデフォルトの実装は、レスポンダー クラスが要求されたアクションを実装している場合は YES を返し、そうでない場合は次のレスポンダーを呼び出します。... クラスがコマンドに対して NO を返した場合でも、レスポンダー チェーンのさらに上の別のレスポンダーが YES を返し、コマンドを有効にする可能性があることに注意してください。

デフォルトの実装はレスポンダー チェーンを再帰するというのは矛盾しているようですが、NO を返すと UIMenuController はレスポンダー チェーンを再帰します。

最も簡単なごまかしは、おそらく nil を返すようにオーバーライド-nextResponderすることですが、それには他の副作用がある可能性があります (たとえば、「nil」ターゲットのアクションは、デフォルトでレスポンダー チェーンを上っていきます!)。

于 2011-10-04T04:01:01.610 に答える