如何使用xib创建单例UIView,以便在不同的VC上使用一个实例?

时间:2018-04-18 15:19:34

标签: swift uiview singleton xib

我有一个自定义的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)
}

如何更改单例的代码以及更改后如何使用此类?

感谢所有答案。

2 个答案:

答案 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的控制台将显示一些警告消息。