2013-03-14 145 views
5

(下面的截圖可以解釋什麼,我試圖做)我如何克隆/複製iOS的某種UIView?

這背後的想法是,我有一個UIView,有各種不同的UI元素中,例如,假設我有一個UIView,裏邊有我們有一個UILabel

現在我想要複製UIView(帶有內部標籤),但之後我需要對標籤進行更改,例如,更改文本屬性。

我需要這樣的東西的原因是我可以用我需要的所有東西來構造UIView,看起來不錯,但實際上有不同的數據和不同的副本。

我不確定這是最好的方法,但它是我能想出的唯一方法。如果任何人有任何想法如何做到這一點,或任何想法更好的方法,我真的很感激它。很多! Screenshot to make it easier to understand

回答

6

這是一個非常自然而有益的事情。你正在尋找的是一個容器視圖控制器。將可重用的「單元」放入其自己的視圖控制器和它自己的nib文件中。然後,在你的父視圖控制器中,使用addChildViewController:來添加儘可能多的這些,並配置它們中的每一個。他們可以分別擁有自己的IBOutlet,您可以使用它來修改內容。

這與UITableViewUITableViewCell(它並未專門使用「子視圖控制器」,但它確實使用此模式)使用的模式非常相似。

有關詳細信息,請參閱適用於iOS的View Controller Programming Guide中的"Creating Custom Container View Controllers"

請注意,故事板在對象模板中包含一個「容器視圖」作爲選項,使其更容易。

如果你想要更低級別的訪問,你也可以手動使用UINib來加載nib文件並連接它的插口(這是我們在iOS 5之前的習慣),但是今天我會用子視圖控制器。

+0

太棒了!我認爲這是解決方案! :D – 2013-03-14 13:57:22

+1

從設計的角度來看,如果它是一個帶有標籤的單元格,擁有一個單獨的視圖控制器對它來說聽起來非常像過度殺傷(可能這就是爲什麼UITableView不這樣做) – 2013-03-14 14:02:04

+1

我認爲最終產品I我正在開發的將會比UILabel更多一點。我可能需要其中的幾個,還有一個'UIImage',可能還有一兩個其他的東西。 – 2013-03-14 14:05:21

7

我個人認爲最好的答案是分別創建每個視圖並根據需要進行配置。你可以創建一個方法,只是配置新的UIView看起來相同,並通過它傳遞每個視圖。

但是,如果你真的需要複製一個UIView,你可以將其存檔,然後將其解壓縮:

id copyOfView = 
[NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:originalView]]; 
UIView *myView = (UIView *)copyOfView; 
[self.view addSubview:myView]; 

如果你有一大堆的這些,請確保您使用的儀器探查時間檢查您的繪圖效率。

+0

謝謝!看起來像一個非常酷的方式,所以只需要清楚,你說的是我創建(和配置)我的視圖,存檔它,然後解除它的存檔?當涉及歸檔視圖時,您還可以將我鏈接到某個資源,或者幫助我解決一些代碼問題? – 2013-03-14 13:46:42

+0

上面的代碼執行存檔和取消存檔。請注意在同一行中使用「NSKeyedArchiver」和「NSKeyedUnarchiver」。這是對任何可歸檔對象進行深層複製的規範方法。 – 2013-03-14 13:57:07

+0

啊,我明白了,是的,現在有更多的意義! – 2013-03-14 13:58:21

0

如果你只有一個標籤在裏面,顯而易見的解決方案是將一個自定義的UIView子類與該標籤添加爲子視圖。每次你需要一個新的視圖時,你都會創建一個自定義子類的實例並設置標籤文本。如果您有多個要設置的東西,其中一些對於您可以使用原型設計模式的所有自定義子類視圖都是通用的,那麼實現起來非常簡單。

+0

啊涼快!是的,這聽起來像是一個很好的做法。沒有想到它(對於整個iOS來說還是新手)我想我會試試這個。 – 2013-03-14 13:54:42