2012-08-12 13 views
8

UIBarButtonItemはサブクラスUIViewではないので、frameのような通常の特性を得ることは不可能です。これを行うには`valueForKey`を使用してUIBarButtonItemのビューにアクセスすると、プライベートAPI違反ですか?

一つの方法は、これは完璧に動作し、あなたが基礎となるUIViewに(例えば)GestureRecognizerを追加することができます[barButtonItem valueForKey:@"view"]

です。

ただし、これはプライベートUIKit API違反ですか?

+0

詳細はhttp://stackoverflow.com/a/5066899/418715を参照してください。 – Joe

+0

こんにちは@ジョー、ええ、私はその1つを見たが、それを作るために何を知りませんでした。今私はそれがうまくいくと思う。彼らがKVCをした理由は、ビューが多くスワップされるということです。 –

答えて

14

これは検証時の即時拒否という点ではプライベートではありませんが、脆弱であるとみなされます(新しいiOSバージョンでは、コードを使用しているアプリストアで既存のアプリが破壊される可能性があります)。

私は、同様のコード(KVC経由でUIToolbarのbackgroundView ivarを取得する)がアプリストアの検証に合格し、プロダクションで使用されていると言えます。

悪いことがある場合は、@try { ... } @catchにメソッドをラップする必要があります。これにより、新しいiOSリリースで失敗する可能性のあるKVCを傍受することができます。それはあなたが他の方法でに取得することができ財産だ「それはプライベートではありません」については、証拠の

+0

ありがとう、偉大な答え、ここで最高の運が最高です。 –

+0

アプリのちょうどあらゆる場所で、このコードでアプリが承認されました。つまり、実行の面では、コードはちょうど1つの場所にあります:)もう一度ありがとう! –

+0

@farcaller、「プライベート」APIで 'setValue:forKey:'を使うのはどう思いますか?'UINavigationItem'の' _customRightViews'プロパティをnilに設定したいと思います。 – Daniel

7

5枚

  • 。これを試してみてください。そのうちの1つは、実際にはUIBarButtonItem_viewイーバルです。これは、UIViewへのアクセス自体が禁止されているわけではないことを示していますが、KVOの方法は疑わしいかもしれませんが(私はそれを疑う)

    NSArray *array = self.toolBar.subviews; 
        for (UIView *view in array) { 
         view.backgroundColor = UIColor.greenColor; 
        } 
    
  • これらは実際にこのプロパティのKVOをトリガします。 ivarsはKVO APIを起動する必要はありません。

  • @Farcallerは、App Storeで販売されている同様のケースについて言及しています。その質問の最初の20分以内に回答したので、これを行うApp Storeに何千ものアプリがあると仮定するのは合理的です(ただし安全ではありません)。

  • このUIViewは、ボタンを押すたびに下位に表示されるため、たとえばジェスチャ認識機能を設定して実行するだけではできません。ただし、viewが置き換えられるたびに同じジェスチャ認識プログラムを設定し続けることができます。私にとって、これは実際にプライベートなAPIではないという証拠ですが、使用する際には非常に慎重でなければなりません(KVOを使用して最新のAPIを使用するようにする必要があります)。

  • 私のアプリはApp Storeで販売されています。

+3

いつまでも無限の答え。おそらくiOS 9にも当てはまります。 – fatuhoku

+0

私はこれが_ **プライベート** _の違いだと思います( "これを使用しないでください。いつでもこの内部実装の詳細を変更する必要があります)文書化されていない** _(「自己責任で使用する、我々は責任を負いません」)。 –

関連する問題