我有一个自定义的UIView子类,它有xib。我需要在我的应用程序中的不同ViewControllers上使用一个实例。
我的自定义视图初始化如下:
@IBOutlet var contentView: UIView!
override init(frame: CGRect) {
super.init(frame: frame)
commitInit()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
commitInit()
}
private func commitInit() {
contentView = loadFromNib(named: "ChartWithPoints")// Extension for UIView class, loading by name
contentView.frame = self.bounds
contentView.autoresizingMask = [.flexibleHeight, .flexibleWidth]
addSubview(contentView)
}
如何更改单例的代码以及更改后如何使用此类?
感谢所有答案。
答案 0 :(得分:0)
我认为你不想要一个单例,也不需要为每个视图控制器使用一个实例。管理一个视图的所有权是完全没必要的。一个类的重点是拥有多个对象。你不需要一个单身人士。
对于每个视图控制器,继续执行您现在正在执行的操作,并为每个控制器实例化一个新的自定义视图。
要回答有关使用子类的问题,请将view属性更改为子类而不是UIView
:
@IBOutlet var contentView: SubclassView!
要详细了解单身人士解决的问题,请查看其上的Wikipedia article。
修改强>
由于您询问了模型 - 视图关系的外观,我将尝试给出一个基本示例。
说,在您的观点中,您希望显示用户的姓名和爱好。单例模型类看起来像这样:
class UserData {
static let singletonUserData = UserData()
var name: String
var hobbies: [String]
private init() {
self.name = "Bob Appleseed"
self.hobbies = ["Swimming", "Planting Apples", "Drawing"]
}
}
然后您将能够通过以下方式访问单身人士:
UserData.singletonUserData
在您的视图类中,您可能有一些标签:
@IBOutlet var nameLabel: UILabel!
@IBOutlet var favoriteHobbyLabel: UILabel!
然后,在初始化之后,您可以使用单例填充标签:
contentView.nameLabel.text = UserData.singletonUserData.name
contentView.favoriteHobbyLabel.text = UserData.singletonUserData.hobbies.first!
如果您想修改单身人士的属性,可以从任何地方更改它们:
UserData.singletonUserData.name = "John Appleseed"
答案 1 :(得分:0)
import UIKit
import Foundation
class CustomView : UIView
{
@IBOutlet weak var titleLabel : UILabel!
// Singleton instance
static let shared : CustomView = CustomView.sharedInstanceFromNib(size: CGSize(width: 100, height: 100))
// You can modify argument list as per your need.
class private func sharedInstanceFromNib(size : CGSize)->(CustomView)
{
// This will connect your IBOutlet's with view's in Xib.
let view = Bundle.main.loadNibNamed("CustomView", owner: self, options: nil)?.first as! CustomView
view.frame.size = size
return view
}
}
注意-首次使用共享实例时,必须在主线程上使用它,否则Xcode的控制台将显示一些警告消息。