Swift – 在课堂上给自己分配一个NIB

我正在为通知下拉横幅创build一个UIView子类。 我正在使用XIB构build视图,并希望在初始化时将该xib分配给该类(即避免必须从调用ViewController执行此操作)。

既然你不能很快地分配“自我”,我该如何从课堂上正确地做到这一点呢?

class MyDropDown: UIView { func showNotification() { self = UINib(nibName: nibNamed, bundle: bundle).instantiateWithOwner(nil, options: nil)[0] as? UIView } } 

对于任何人如何从swift自己的类初始化xib,这是使用自定义类初始值设定项的最佳方法:

 class MyCustomView: UIView { @IBOutlet weak var imageView: UIImageView! @IBOutlet weak var titleLabel: UILabel! class func initWithTitle(title: String, image: UIImage? = nil) -> MyCustomView { var myCustomView = UINib(nibName: "MyCustomView", bundle: nil).instantiateWithOwner(nil, options: nil)[0] as? MyCustomView myCustomView.titleLabel.text = title if image != nil { myCustomView.imageView.image = image } //...do other customization here... return myCustomView } } 

我通常的做法如下:

  1. 在我的自定义视图类中设置FileOwner
  2. 设置所有必需的出口和行动
  3. 将出口设置为笔尖中的视图,并将其命名为“contentView”
  4. init*方法中 – 用owner来实例化nib,并将子视图添加到我的自定义视图对象中。

这是以这种方式实现的集合标题视图的示例。

 @interface Header : UITableViewHeaderFooterView @property (nonatomic) IBOutlet UIView *contentView; @property (weak, nonatomic) IBOutlet UILabel *labelTitle; // other required outlets & actions // ... @end #import "Header.h" @implementation Header - (id)initWithReuseIdentifier:(NSString *)reuseIdentifier { if (self = [super initWithReuseIdentifier:reuseIdentifier]) { [[NSBundle mainBundle] loadNibNamed:@"Header" owner:self options:nil]; [self.contentView addSubview:self.content]; UIView *subview = self.content; self.content.translatesAutoresizingMaskIntoConstraints = NO; NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(subview); [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[subview]|" options:0 metrics: 0 views:viewsDictionary]]; [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[subview]|" options:0 metrics: 0 views:viewsDictionary]]; } return self; } @end 

// 更新 Swift示例

主要的想法是不从nib直接加载视图到self而是从nib /作为子视图添加它/ view到self

 import UIKit class CustomView: UIView { @IBOutlet var contentView: UIView! @IBOutlet weak var labelTitle: UILabel! required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) self.__loadContent() } override init(frame: CGRect) { super.init(frame: frame) self.__loadContent() } private func __loadContent() { // create nib let nib = UINib(nibName: "CustomView", bundle: NSBundle.mainBundle()) // load outlets to self nib.instantiateWithOwner(self, options: nil) // add content view as a subview self.addSubview(self.contentView) // disable autoresizing self.contentView.setTranslatesAutoresizingMaskIntoConstraints(false) // manually create constraints to fix content view inside self with 0 padding let viewsDict: NSDictionary = ["content": self.contentView] let vertical = NSLayoutConstraint.constraintsWithVisualFormat("V:|[content]|", options: NSLayoutFormatOptions.allZeros, metrics: nil, views: viewsDict) let horizontal = NSLayoutConstraint.constraintsWithVisualFormat("H:|[content]|", options: NSLayoutFormatOptions.allZeros, metrics: nil, views: viewsDict) self.addConstraints(vertical) self.addConstraints(horizontal) } } 

InterfaceBuilder中