【问题标题】:IB_DESIGNABLE Class not rendering on Interface BuilderIB_DESIGNABLE 类未在 Interface Builder 上呈现
【发布时间】:2015-01-16 01:30:47
【问题描述】:

这是我第一次在 Xcode 上使用 IB_DESIGNABLE。

我有这个类来为 NSView 添加颜色。

标题

#import <Cocoa/Cocoa.h>


IB_DESIGNABLE @interface NSViewComCor : NSView

@property (nonatomic, weak) IBInspectable NSColor *backgroundColor;

@end

实施

#import "NSViewComCor.h"

@implementation NSViewComCor

@synthesize backgroundColor = _backgroundColor;

- (void)awakeFromNib {

  [super awakeFromNib];

  [self setWantsLayer:YES];
  self.backgroundColor = [NSColor whiteColor];  //default color
}

- (NSColor *) backgroundColor
{
  CGColorRef colorRef = self.layer.backgroundColor;
  return [NSColor colorWithCGColor:colorRef];
}

- (void) setBackgroundColor:(NSColor *)backgroundColor
{ // color should change when changed on interface builder inspectable color box
  self.layer.backgroundColor = backgroundColor.CGColor;
  _backgroundColor = backgroundColor;
}

即使使用 IB_DESIGNABLE,此类在界面生成器上也不会以正确的颜色呈现...为什么?

【问题讨论】:

  • "没有用正确的颜色渲染" 这没有意义。它显示什么颜色
  • “在界面生成器可检查颜色框上更改时颜色应该改变”。不,这不是 Inspectable 的工作方式。
  • 白色。并非毫无意义:我在界面生成器上调整颜色,在界面生成器上继续为白色,在我运行应用程序时继续为白色。

标签: xcode cocoa interface-builder ibdesignable ibinspectable


【解决方案1】:

正如 WWDC 2014 "What's New in Interface Builder" 视频中指出的那样,您必须:

  1. 创建框架。

  2. 创建类。

  3. 将视图标记为可设计(并将属性标记为可检查)。

  4. 回到主项目,在Interface Builder中指定基类。

例如,我在项目中添加了一个新的“框架”目标,并在该框架中添加了以下NSView 子类源:

IB_DESIGNABLE @interface CustomView : NSView

@property (nonatomic, strong) IBInspectable NSColor *backgroundColor;

@end

@implementation CustomView

- (void)drawRect:(NSRect)dirtyRect {
    [super drawRect:dirtyRect];

    [self.backgroundColor setFill];
    NSRectFill(dirtyRect);
}

@end

然后,当我回到我的主项目并尝试将这个 CustomView 添加为我的故事板上的子视图时,“背景颜色”是 IB“可检查的”,我可以看到立即在 IB 中呈现的颜色变化.

【讨论】:

  • 好的,像框架一样工作,但只有当它是框架时才能工作?太可怕了。
  • 我讨厌只有当它是一个框架时才能工作。框架很难维护。无论如何,感谢您的惊人帮助。
  • 当框架是项目中的依赖目标时,真的没那么糟糕。但我听到了。但是鉴于 IB 实际上正在运行您的代码,它不是一个疯狂的要求,即它是一个孤立的、独立的代码。此外,值得注意的是,虽然 WWDC 视频非常具体地需要框架,但我注意到它似乎可以在没有框架的 iOS 目标中工作。我不确定我是否愿意依赖这一点,但这可能表明未来可能会考虑一些灵活性。
  • Xcode 必须能够构建包含IB_DESIGNABLE 代码的目标。因此,如果您将它放在您的主要目标中,如果您正在处理阻止其成功编译的问题,则该视图可能并不总是在 IB 中可动态预览。如果将它放在单独的框架目标中,则更容易确保 (a) 它可以快速编译; (b) 它不必频繁地重新编译; (c) 不会受到主要目标的在制品的不利影响。所以我不知道 Apple 指示我们使用框架是否还有其他原因,但有令人信服的务实原因。
  • @zic10 - 如果您还没有看过,我真的建议您观看整个视频。但是,在回答您的问题时,视频的前半部分主要是关于实时视图。他们在视频中大约 7:45 演示了如何创建单独的框架。他们在视频大约 27 点 48 分阐明了这个独立框架的基本原理。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多