2017-07-20 60 views
0

我有一個或多或少的特殊情況的問題。我必須複製從nib加載的UIView。這是源變量的initaliziation:Swift 3 - IBOutlet無副本UIView

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

的觀點有兩個標籤,像這樣網點性質:

class MyView: UIView { 

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

} 

在我來說,我必須複製這一觀點。所以,我發現這個解決方案應該很好地工作:

import UIKit 

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

} 

不幸的是,當我把這個行:

let copyView = view.copyView() 

labelsubLabel屬性是零。在view他們被設置。 MyView.xib中的FilesOwner設置爲MyView

複製函數可以在我的情況下工作嗎?有人建議如何在這裏繼續?

+1

你真的需要複製整個視圖嗎?也許不復制整個視圖會更有意義,但只是將一些屬性傳遞給此視圖的新實例 –

+0

是的,當然這是解決方案。不幸的是我需要通過這種方式進行復制。原因我有一個只有UIView作爲參數的函數。所以它在不知道UIView的子類的情況下創建一個副本。 –

+0

我也沒有看到'NSKeyedUnarchiver'的副本視圖...只是創建一個具有相同屬性值的新副本 – Tj3n

回答

1

獲取使用以下方法

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

的UIView希望它能幫助。

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實例,並仍然利用多態性。 Here's如何:

假設你有以下擴展名來實例化一個通用的視圖控制器:

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返回精確的相同類型的另一種觀點認爲:

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子類的方法。

希望這會有所幫助!