2009-10-15 35 views
2

我試圖爲iPhone自定義UIImagePickerController。我可以修改默認按鈕(取消和取消)以及添加更多按鈕。 但是我試圖使定製的按鈕看起來像缺省iPhone的外觀一樣麻煩。 起初我認爲它會是可能的,如果我得到,然後複製默認的按鈕,如下面的代碼在Objective-C中複製UI元素

UIButton *cancelButton = [[[[[[[[[[[[[[[[self.view subviews] objectAtIndex:0] 
          subviews] objectAtIndex:0] 
          subviews] objectAtIndex:0] 
          subviews] objectAtIndex:0] 
          subviews] objectAtIndex:2] 
          subviews] objectAtIndex:0] 
          subviews] objectAtIndex:1] 
          subviews] objectAtIndex:1]; 


UIButton *anotherButton = [cancelButton copy]; 

礦山模板但由於我剛剛知道最近的事實沒有工作NSObject及其子類默認情況下不實現協議NSCopying。

我不知道有沒有什麼辦法要麼 - 複製的UI元素,然後修改它作爲我的遺囑 - 創建與蘋果的人的外觀自定義按鈕

+4

無論您如何複製它,該代碼都非常脆弱。您依賴於層次結構中的意見模式。操作系統版本和你的應用程序之間的一個變化將立即崩潰。 – Ken

+9

當我看到這段代碼時,我內心有點死了。 –

+3

我想我們中的很多人都有點呃,怎麼說這很好 - *對你如何訪問cancelButton感到震驚。 – mahboudz

回答

5

如果你想複製任何UIView,把它放在一個nib文件中,並根據需要多次加載它。

另一種方法是將現有的視圖進行歸檔,然後將其取消歸檔。請參閱NSKeyedArchiver類。

id theButton; //whatever way you obtain this... 
id copyOfTheButton = [NSKeyedUnarchiver unarchiveObjectWithData: 
        [NSKeyedArchiver archivedDataWithRootObject: theButton]]; 
+0

+1使用NSCoding取代NSCopying非常明顯和優雅,我很尷尬地忽略它。這是一個非常好的解決方案。 –

+0

那麼,你應該記住,這不是一個輕量級的方法。例如,適用於複製視圖等,但您不希望將其用於模型圖層中的大量對象。 – NSResponder

+0

謝謝,這樣一個不錯的解決方案 –

1

有沒有簡單的方法來複制Objective-C對象不執行 NSCopying (除非您使用NSResponder的建議使用NSCoding,在這種情況下有。)NSCopyObject(),但這可能是所有Foundation中最危險的功能(請參閱NSCopyObject() considered harmful關於這個瘋狂功能的想法)。

您的選擇安全或有危險。安全的方法就是將元素的外觀和感覺複製到自己的代碼中。這很乏味,但通常是可以實現的。危險的方法是對元素的類和接口進行逆向工程,並嘗試創建自己的實例(使用alloc/init)。這可能會起作用,它可能不會,它可能會在操作系統版本之間中斷,但它可能會給您更好的結果,速度更快。就我個人而言,我傾向於儘可能地用手重新創建原始元素。一般來說,Photoshop是這項工作的重要組成部分。