Swift 3 - 复制UIView后的IBOutlet为零

时间:2017-07-20 09:00:04

标签: ios swift uiview

我对一个或多或少特殊情况有疑问。我必须复制一个从笔尖加载的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

复制功能可以在我的情况下工作吗?有人建议如何在这里继续吗?

3 个答案:

答案 0 :(得分:1)

使用以下方法获取UIView

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

希望有所帮助。

答案 1 :(得分:1)

说实话,你的用例仍然有些奇怪,虽然我不知道你的整个代码,但我没有看到使用NSKeyedArchiver实现你想要达到的目的。当然,可以实例化一个新的UIView实例并仍然利用多态性。方法如下:

假设您有以下扩展来实例化通用视图控制器:

class MySubView: AnyParentView {

    var testVariable: Int?

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

        view.testVariable = self.testVariable

        return view
    }
}

现在你向UIView添加了另一个扩展,以返回另一个完全相同类型的视图:

    print("enter your age")
age = int(input())
if age < 21:
    print("no beer")
if age > 21:
    print("what beer do you like?")
beer = input()
if beer == "union":
    print("this is water")
if beer == "jelen":
    print("great")
else:
    print("aren't you drinking ? ")

您甚至可以在子类中覆盖此方法以传递自定义变量:

QAbstractListModel

现在,您可以轻松地实例化视图并复制它们,同时保留各自的子类型。如果在xib中正确设置了出口,则它们也将被设置为新的“复制”视图实例。然后,您可以将其传递给需要UIView子类的方法。

希望这有帮助!

答案 2 :(得分: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")
    }
}