由於UIBarButtonItem
不繼承UIView
,這是不可能得到像在其frame
正常特性。要做到這一點使用`valueForKey`訪問UIBarButtonItem中的視圖,私有API違規?
一種方法是[barButtonItem valueForKey:@"view"]
這完美的作品,並允許您添加GestureRecognizer(例如)到底層UIView
。
然而,這是一個私人UIKit
API違規?
由於UIBarButtonItem
不繼承UIView
,這是不可能得到像在其frame
正常特性。要做到這一點使用`valueForKey`訪問UIBarButtonItem中的視圖,私有API違規?
一種方法是[barButtonItem valueForKey:@"view"]
這完美的作品,並允許您添加GestureRecognizer(例如)到底層UIView
。
然而,這是一個私人UIKit
API違規?
這不是在驗證時立即拒絕而言私人,但它是足夠的私人被認爲是脆弱的(即,新的iOS版本可以打破目前正使用該代碼的應用程序商店現有的應用程序)。
我可以說,一個類似的代碼(在抓取經由KVC UIToolbar的backgroundView的ivar)已通過應用商店的驗證和在生產中被使用。
在可能的不好的事情時,你必須包裹方法@try { ... } @catch
,讓你攔截KVC在較新的IOS版本可能失敗。
謝謝,很好的回答,在這裏好運。 – 2012-08-12 17:48:12
應用程序剛剛在應用程序的每個角落都通過了此代碼。我的意思是,就執行而言,代碼只在一個地方:)所以再次感謝! – 2012-08-30 18:47:48
@farcaller,你如何看待在「private」api上使用'setValue:forKey:'?我想爲'UINavigationItem'設置_customRightViews屬性爲nil。 – Daniel 2013-05-31 03:53:38
五件證據爲「這不是私人」
它,你可以得到在其他方面的屬性。試試看,其中一個觀點實際上是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中出售,並做到這一點。
什麼是永恆的答案。可能仍然適用於iOS 9. – fatuhoku 2015-08-25 15:19:06
我猜這是_ ** private ** _(「不要使用它,我們需要隨時更改此內部實現細節」)和_ **之間的區別無證**(「使用風險自負,我們不負責任」)。 – 2016-01-29 04:53:37
查看此答案http://stackoverflow.com/a/5066899/418715瞭解更多信息。 – Joe 2012-08-13 14:49:34
嗨@Joe,是的,我看到了一個,但不知道該怎麼做。現在我認爲它會沒事的。他們之所以選擇KVC,是因爲這個視圖交換了很多。 – 2012-08-13 20:55:40