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 未显示在情节提要上的主要内容,如果未能解决你的问题,请参考以下文章
如何从 xib 文件 uiview 到情节提要 ViewController
XCODE:UIView 背景没有出现在屏幕上,即使我在情节提要中设置了颜色并以编程方式