2012-08-12 66 views
8

由於UIBarButtonItem不繼承UIView,這是不可能得到像在其frame正常特性。要做到這一點使用`valueForKey`訪問UIBarButtonItem中的視圖,私有API違規?

一種方法是[barButtonItem valueForKey:@"view"]

這完美的作品,並允許您添加GestureRecognizer(例如)到底層UIView

然而,這是一個私人UIKit API違規?

+0

查看此答案http://stackoverflow.com/a/5066899/418715瞭解更多信息。 – Joe 2012-08-13 14:49:34

+0

嗨@Joe,是的,我看到了一個,但不知道該怎麼做。現在我認爲它會沒事的。他們之所以選擇KVC,是因爲這個視圖交換了很多。 – 2012-08-13 20:55:40

回答

14

這不是在驗證時立即拒絕而言私人,但它是足夠的私人被認爲是脆弱的(即,新的iOS版本可以打破目前正使用該代碼的應用程序商店現有的應用程序)。

我可以說,一個類似的代碼(在抓取經由KVC UIToolbar的backgroundView的ivar)已通過應用商店的驗證和在生產中被使用。

在可能的不好的事情時,你必須包裹方法@try { ... } @catch,讓你攔截KVC在較新的IOS版本可能失敗。

+0

謝謝,很好的回答,在這裏好運。 – 2012-08-12 17:48:12

+0

應用程序剛剛在應用程序的每個角落都通過了此代碼。我的意思是,就執行而言,代碼只在一個地方:)所以再次感謝! – 2012-08-30 18:47:48

+0

@farcaller,你如何看待在「private」api上使用'setValue:forKey:'?我想爲'UINavigationItem'設置_customRightViews屬性爲nil。 – Daniel 2013-05-31 03:53:38

7

五件證據爲「這不是私人」

  • 它,你可以得到在其他方面的屬性。試試看,其中一個觀點實際上是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 2015-08-25 15:19:06

+0

我猜這是_ ** private ** _(「不要使用它,我們需要隨時更改此內部實現細節」)和_ **之間的區別無證**(「使用風險自負,我們不負責任」)。 – 2016-01-29 04:53:37