2012-05-16 103 views
12

UII需要複製,自控制器或self.view,我曾嘗試:克隆或複製的UIViewController或UIView的

UIView* viewOfSelf =[self.view copy]; 
UIViewController* controller = [self copy]; 

UIView* viewOfSelf =[self.view mutableCopy]; 
UIViewController* controller = [self mutableCopy]; 

錯誤是:

-[UIViewController mutableCopyWithZone:]: unrecognized selector sent to instance 0xb803490 
    -[UIView copyWithZone:]: unrecognized selector sent to instance 0x6e0acb0 
+0

什麼是自我類? 'MyViewController'?我認爲沒有可變的'UIView'和'UIViewController'拷貝 – Raptor

回答

30

使用 -

NSData *tempArchiveView = [NSKeyedArchiver archivedDataWithRootObject:self.view]; 
UIView *viewOfSelf = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveView]; 

同樣 -

NSData *tempArchiveViewController = [NSKeyedArchiver archivedDataWithRootObject:self]; 
UIViewController *controller = [NSKeyedUnarchiver unarchiveObjectWithData:tempArchiveViewController]; 
+2

沒有得到一切,如自定義手勢等 – jjxtra

+0

嗯沒有得到我的UIImageView我有作爲我克隆的視圖的子視圖。 –

5

對於一個目的是可拷貝它必須執行NSCopying協議,其中UIView類,UIViewController類不。

如果你想複製一個視圖,我敢肯定你做錯了什麼。複製應該用可重複使用的UIView代替,就像UITableView使用dequeueReusableCellWithIdentifier:方法一樣。

複製視圖控制器絕對是一種反模式。如果您需要您已有的視圖控制器的精確副本 - 使用當前參數的相同參數創建它的新實例。

+1

儘管Rishi的答案也適用於我,但創建新的實例證明對我的問題來說是一個更可靠的解決方案。謝謝! – Myxtic

4

不幸的是我還沒有允許發表評論,但日食的解決方案有一個問題:它不會複製NSLayoutConstraint秒。因此,如果您的任何視圖都使用了自動佈局,那麼這些視圖就不會被複制。我正在編寫一個小型庫來解決這個問題,並在完成後將它發佈到github上。不幸的是,我還沒有在任何地方找到隨時可用的解決方案。

//編輯

對不起,我之前寫的不完全正確。我做了一些更多的研究,結果發現默認情況下,存檔視圖中的NSLayoutConstraint不會被保存。但是,實際上可以通過將其shouldBeArchived屬性設置爲YES來指定是否要歸檔約束。然後,即使在假冒copy之後,您仍然在複製的視圖中保留正確的約束。