【问题标题】:IBDesignable not working in Objective-CIBDesignable 在 Objective-C 中不起作用
【发布时间】:2015-10-23 08:53:33
【问题描述】:

我有许多用 nib 设计的可重用视图,它们都是 NibView 类的子类

class NibView: UIView {

var view: UIView!

func setupNib(nibName:String) {
    view = loadViewFromNib(nibName)
    view.frame = bounds
    view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
    addSubview(view)
}

func loadViewFromNib(nibName:String) -> UIView {
    let bundle = NSBundle(forClass: self.dynamicType)
    let nib = UINib(nibName: nibName, bundle: bundle)
    let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
    return view
}

}

我是这样子类化的

@IBDesignable class ExampleView: NibView {

@IBOutlet weak var label: UILabel!

private var _property:Int = 0
@IBInspectable var property:Int {
    set {
        _property = newValue
        label.text = "\(newValue)"
    } get {
        return _property
    }
}

override init(frame: CGRect) {
    super.init(frame: frame)
    setup()
}

required init(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    setup()
}

func setup() {
    setupNib("ExampleView")
}

override func layoutSubviews() {
    super.layoutSubviews()
    // custom init

}
}

在 NIB 文件中,我将文件的所有者设置为 ExampleView。 一切都完美无缺,故事板和 xib 都可以实时呈现一切。

现在,在 Objective-C 中做同样的事情是行不通的

IB_DESIGNABLE

@interface ExampleView : NibView

@property (nonatomic) IBInspectable NSUInteger count;

@end


@implementation NibView

- (void)setupNib:(NSString *)nibName {
    self.view = [self loadViewFromNib:nibName];
    self.view.frame = self.bounds;
    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self addSubview:self.view];
}

- (UIView *)loadViewFromNib:(NSString *)nibName {
    UIView *view = [[[NSBundle mainBundle] loadNibNamed:nibName owner:self options:nil] objectAtIndex:0];
    return view;
}

@end

@implementation ExampleView

- (id)init {
     self = [super init];
     if(self) {
        [self setup];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame {
     self = [super initWithFrame:frame];
     if(self) {
        [self setup];
    }
     return self;
}

- (id)initWithCoder:(NSCoder *)aDecoder {
     self = [super initWithCoder:aDecoder];
     if(self) {
        [self setup];
    }
     return self;

}

- (void)setup {
    [self setupNib:@"ExampleView"];
     // Custom init
}

有什么想法吗?

【问题讨论】:

  • 我最后遇到了同样的问题,我将部署目标从 IOS7 更改为 IOS8 并解决了问题,(您也可以调试它 Editor-> Debug Selected Views 并查看崩溃发生的位置),只是好奇这对你来说是不是同样的问题。

标签: objective-c swift xib ibdesignable ibinspectable


【解决方案1】:

我知道这个问题很老了,但我也遇到了类似的问题,由于 Objective C 的例子不多,我想分享我的解决方案。

您在 Objective C 中使用的代码与在 SWIFT 中使用的代码不同。 在 Objective C 中,您尝试访问主包,但是当尝试在 IB 中加载视图时,没有主包。 这段代码对我有用:

NSBundle *bundle = [NSBundle bundleForClass:self.classForCoder];
self.view = [[bundle loadNibNamed:@"HighscoreLabelView" owner:self options:nil] objectAtIndex:0];

【讨论】:

  • 哇,非常感谢!我在Obj-CIB_DESIGNABLE 相处时遇到了困难,这都是因为这个!感谢您在 SO 上注册以分享此内容!欢迎来到社区:)
  • 谢谢!在通过 UIView 和 Swift 示例进行无休止的搜索之后,这个,这个就在这里是刚刚挽救了我理智的缺失链接。 =)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
  • 2014-08-19
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多