07-18-2023, 08:45 PM
In my project I implemented the following (very similar to Peter's Solution)
import UIKit
// MARK: - Protocol Declaration
public protocol InterfaceBuilderInstantiable
{
/// The UINib that contains the view
///
/// Defaults to the swift class name if not implemented
static var associatedNib : UINib { get }
}
// MARK: - Default Implementation
extension InterfaceBuilderInstantiable
{
/// Creates a new instance from the associated Xib
///
/// - Returns: A new instance of this object loaded from xib
static func instantiateFromInterfaceBuilder() -> Self
{
return associatedNib.instantiate(withOwner:nil, options: nil)[0] as! Self
}
static var associatedNib : UINib
{
let name = String(describing: self)
return UINib(nibName: name, bundle: Bundle.main)
}
}
To use, you just simply implement the protocol:
class MyView: UIView, InterfaceBuilderInstantiable
{
// The rest
And if your nib is the same name as your class (`MyView.xib`), you're set: the default implementation of the protocol looks for a nib with the same name as the class in the main bundle.
Of course, if your nib is in another bundle or has a different name you can override the `associatedNib` and return your own nib.
import UIKit
// MARK: - Protocol Declaration
public protocol InterfaceBuilderInstantiable
{
/// The UINib that contains the view
///
/// Defaults to the swift class name if not implemented
static var associatedNib : UINib { get }
}
// MARK: - Default Implementation
extension InterfaceBuilderInstantiable
{
/// Creates a new instance from the associated Xib
///
/// - Returns: A new instance of this object loaded from xib
static func instantiateFromInterfaceBuilder() -> Self
{
return associatedNib.instantiate(withOwner:nil, options: nil)[0] as! Self
}
static var associatedNib : UINib
{
let name = String(describing: self)
return UINib(nibName: name, bundle: Bundle.main)
}
}
To use, you just simply implement the protocol:
class MyView: UIView, InterfaceBuilderInstantiable
{
// The rest
And if your nib is the same name as your class (`MyView.xib`), you're set: the default implementation of the protocol looks for a nib with the same name as the class in the main bundle.
Of course, if your nib is in another bundle or has a different name you can override the `associatedNib` and return your own nib.