2012-05-16 15 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

必要がありますプロトコルを実装するUIViewクラスもUIViewControllerクラスも実装していません。

ビューをコピーする場合は、間違ったことをしていると思います。コピーは、dequeueReusableCellWithIdentifier:メソッドを使用してUITableViewのように、再利用可能なUIViewに置き換える必要があります。

ビューコントローラのコピーは間違いなくアンチパターンです。すでに持っているView Controllerを正確にコピーしたい場合は、現在のものと同じパラメータで新しいインスタンスを作成します。

+1

イベントリシの答えも私にとってはうまくいったが、新しいインスタンスを作成することは、私の問題に対してより信頼できる解決策であることが判明した。ありがとう! – Myxtic

4

は、残念ながら私はまだコメントすることは許されないのですが、リシのソリューションは、一つの問題があります。それはNSLayoutConstraint Sをコピーしません。だからあなたの意見のいずれかが自動レイアウトを使用している場合、それらはコピーされません。私はそれを解決するためのミニラボを書いており、完了するとgithubに投稿します。残念ながら、すぐに使用できるソリューションはどこにも見つかりませんでした。

//編集

申し訳ありませんが、私が以前に書いたことは完全に正しくありませんでした。私はさらに調査を行いましたが、デフォルトでは、アーカイブビューのNSLayoutConstraintは保存されません。しかし、shouldBeArchivedプロパティをYESに設定して、制約をアーカイブするかどうかを実際に指定できます。次に、この偽のcopyの後でも、コピーしたビューに正しい制約を保持します。

関連する問題