我对一个或多或少特殊情况有疑问。我必须复制一个从笔尖加载的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()
label
和subLabel
属性为零。在view
中,他们已经设置好了。 MyView.xib
中的FilesOwner设置为MyView
类
复制功能可以在我的情况下工作吗?有人建议如何在这里继续吗?
答案 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")
}
}