2017-07-20 7 views
0

多かれ少なかれ特別なケースについて質問があります。私はnibからロードされているUIViewをコピーする必要があります。これは、ソース変数のinitaliziationです:Swift 3 - コピー後のIBOutletなしUIView

let view = Bundle.loadView(fromNib: "MyView", withType: MyView.self) 

ビューはそうのようなコンセントのプロパティとして2つのラベルがあります。私の場合は

class MyView: UIView { 

    @IBOutlet weak var label: UILabel! 
    @IBOutlet weak var subLabel: UILabel! 

} 

を私は、このビューをコピーする必要があります。

let copyView = view.copyView() 

labelsubLabelプロパティがnilです:

import UIKit 

extension UIView 
{ 
    func copyView<T: UIView>() -> T { 
     return NSKeyedUnarchiver.unarchiveObject(with: NSKeyedArchiver.archivedData(withRootObject: self)) as! T 
    } 

} 

は、残念ながら、私はこの行を呼び出します。だから私は、正常に動作する必要があり、この解決策を見つけました。 viewに設定されています。 MyView.xibのFilesOwnerは MyViewクラスに設定されています

私の場合、コピー機能は動作しますか?誰かがここに進む方法をアドバイスしていますか?

+1

本当に全体のビューをコピーする必要がありますか?おそらく、全体のビューをコピーしないで、このビューの新しいインスタンスに渡す属性だけをコピーする方が意味があります。 –

+0

もちろん、これは解決策です。残念ながら私はこの方法でコピーを作成する必要があります。私はパラメータとしてUIViewだけ持っている関数があります。したがって、UIViewのサブクラスを知らなくてもコピーを作成します。 –

+0

私は 'NSKeyedUnarchiver'によるコピービューのポイントを見ません...同じプロパティ値を持つ新しいものを作成してください。 – Tj3n

答えて

1

UIViewのは、それが役立つホープ方法

let view = MyView(nibName: "MyView", bundle: nil) 

の下に使用して取得します。

0

多分次のように動作する可能性がありますか?良い一日を。

import Foundation 
import UIKit 

class MyView: UIView { 

    @IBOutlet weak var label: UILabel! 
    @IBOutlet weak var subLabel: UILabel! 

    required convenience init?(coder aDecoder: NSCoder) { 
     self.init() 
     self.label = aDecoder.decodeObject(forKey: "label") as? UILabel 
     self.subLabel = aDecoder.decodeObject(forKey: "subLabel") as? UILabel 
    } 

    func encodeWithCoder(aCoder: NSCoder) { 
     aCoder.encode(self.label, forKey: "label") 
     aCoder.encode(self.subLabel, forKey: "subLabel") 
    } 
} 
1

私はあなたの全体のコードを知っているドントが、私はあなたが達成したいもののためにNSKeyedArchiverを使用してポイントを参照してくださいドントが、あなたのユースケースについて奇妙な何かがまだある正直に言うと。もちろん、新しいUIViewインスタンスをインスタンス化し、多態性を利用することは可能です。

import UIKit 

extension UIView { 

    class func fromNib(owner: AnyObject? = nil) -> Self { 
     return UIView.fromNib(owner: owner) 
    } 

    class func fromNib<T : UIView>(owner: AnyObject? = nil) -> T { 
     return UIView.fromNib(withName: T.className, owner: owner) as! T 
    } 

    class func fromNib(withName name: String, owner: AnyObject? = nil) -> UIView { 
     return Bundle.main.loadNibNamed(name, owner: owner, options: nil)![0] as! UIView 
    } 
} 

そして今、あなたは正確に同じタイプの別のビューを返すためのUIViewに別の拡張子を追加します:

あなたは汎用ビューコントローラをインスタンス化するには、以下の拡張子を持っている想像:

方法Here's
extension UIView { 

    func getCopy() -> Self { 
     return UIView.fromNib() 
    } 
} 

あなたも、カスタム変数を渡すためにあなたのサブクラスでこのメソッドをオーバーライドすることができます

class MySubView: AnyParentView { 

    var testVariable: Int? 

    override func getCopy() -> MySubView { 
     let view = MySubView.fromNib() 

     view.testVariable = self.testVariable 

     return view 
    } 
} 

ビューを簡単にインスタンス化し、それぞれのサブタイプを保持しながらコピーすることができます。アウトレットがxibに正しく設定されている場合は、新しい「コピーされた」ビューインスタンスにも設定されます。その後、UIViewサブクラスを必要とするメソッドに渡すことができます。

希望すると便利です。

関連する問題