UIView 未显示在情节提要上

Posted

技术标签:

【中文标题】UIView 未显示在情节提要上【英文标题】:UIView not displaying on storyboard 【发布时间】:2015-04-24 20:14:26 【问题描述】:

我创建了一个 UIView(KGCalloutView) 并将其放置在我的 Storyboard(Main.storyboard) 中,方法是拖动 View 对象并将类设置为 KGCalloutView。但是,当我运行该项目时,该视图永远不会显示在情节提要中。

我第一次尝试解决需要添加以下方法,但是它导致我相信一个无限循环(可以理解)并最终崩溃。

- (void)awakeFromNib 
    if ([[NSBundle mainBundle] loadNibNamed:@"KGCalloutView" owner:self options:nil]) 
        [self.view setFrame:[self bounds]];
        [self addSubview:self.view];
    

接下来我尝试在下面添加init方法,但也没有解决问题:

- (id)initWithCoder:(NSCoder *)aDecoder 
    if ((self = [super initWithCoder:aDecoder])) 
    

    return self;

我尝试发布我的 .xib 和 Main.storyboard 的图片,但我想我的声誉还不够高。

这里是 KGCalloutView.h:

@interface KGCalloutView : UIView <UIPickerViewDataSource, UIPickerViewDelegate>

@property (nonatomic) IBInspectable NSString *title;
@property (strong, nonatomic) IBOutlet KGCalloutView *view;

@property (weak, nonatomic) IBOutlet UITextField *titleField;
@property (weak, nonatomic) IBOutlet UIPickerView *typePickerView;

@end

这里是 KGCalloutView.m:

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


- (void)awakeFromNib 
    if ([[NSBundle mainBundle] loadNibNamed:@"KGCalloutView" owner:self options:nil]) 
        [self.view setFrame:[self bounds]];
        [self addSubview:self.view];
    


-(void)layoutSubviews
    self.titleField.text = @"test";
    self.typePickerView.dataSource = self;
    self.typePickerView.delegate = self;

这是我的 ViewController.h:

@interface ViewController : UIViewController

@property (weak, nonatomic) IBOutlet KGCalloutView *callout;

@end

这是我的 ViewController.m:

- (void)viewDidLoad 
    [super viewDidLoad];

【问题讨论】:

【参考方案1】:

您需要在 ViewController 中加载视图才能看到它。

首先,确保将视图的文件所有者类设置为 ViewController(看起来你已经这样做了)

其次,将视图连接到 ViewController 的属性(标注)

第三,不要在 KGCalloutView.m 中实现,而是在 ViewController.m 中执行以下代码

- (void)viewDidLoad 
    [super viewDidLoad];

    if ([[NSBundle mainBundle] loadNibNamed:@"KGCalloutView" owner:self options:nil]) 
//This will load view from storyboard to IBOutlet callout
        [self.callout setFrame:[self.view bounds]];
        [self.view addSubview:self.callout];
    

【讨论】:

谢谢莎莉。问题是我不想在视图控制器中加载视图。我希望能够将视图添加到 Interface Builder 中的视图控制器,以便我可以添加我的约束。我知道我可以通过编程方式添加约束,但我宁愿不必这样做。 另外,我的视图 KGCalloutView.xib 的文件所有者是 KGCalloutView,它是 UIView 的子类,而不是 UIViewController,以防不清楚。 对于您的第二个项目,我确实在视图控制器上有一个属性,该属性与情节提要上的 KGCalloutView 对象相关联。【参考方案2】:

把nib加载代码放在initwithcoder下面

【讨论】:

这会导致调用 initWithCoder。我可以加入一些逻辑,只在第一次执行时才执行,但这是否必要? 把你在awakeFromNib下的东西直接放在返回之前的initWithCoder下。【参考方案3】:

我无法得到有效的答案,所以我只是在 ViewController 中加载了我的笔尖,而不是我的自定义视图:/

【讨论】:

以上是关于UIView 未显示在情节提要上的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自动布局在情节提要上使网格并排 uiview 响应

如何从 xib 文件 uiview 到情节提要 ViewController

XCODE:UIView 背景没有出现在屏幕上,即使我在情节提要中设置了颜色并以编程方式

在情节提要中定位 UILabel

UIView (或 UILabel ?)与情节提要中另一个 View 的链接

将 UIView 添加到情节提要