UIView:从自定义 XIB 加载导致崩溃
Posted
技术标签:
【中文标题】UIView:从自定义 XIB 加载导致崩溃【英文标题】:UIView: Loading from custom XIB causing a crash 【发布时间】:2015-09-12 12:48:08 【问题描述】:你好 ***。
我正在尝试设置一个UIView
以便它从XIB
加载自身
Xcode 中的文件。
为此,我完成了以下初始步骤:
-
创建了空的
UIView
子类。
添加了一个空白XIB
文件。
然后,我将我想要的所有子视图添加到XIB
文件中,并在UIView
子类中创建了对应的IBOutlet Properties
。
我观看了this video,向我展示了如何正确连接插座并设置文件所有者。该视频指示我执行以下操作:
不要将 UIView 类设置为XIB
中的子类。 Time link
在XIB
:Time Link 中将File's Owner
设置为UIView
子类
将 IBOutlet 插入到 UIView 类型的 UIView 类中,以便您的 XIB 文件可以加载到其中。Time link
如果您打算在另一个 XIB
文件中初始化自定义 UIView
,请覆盖 initWithCoder
like (image)。
如果您打算在另一个类文件中以编程方式初始化自定义UIView
,请覆盖initWithFrame
like (image)。
很酷,我已经完成了所有这些事情,并选择以编程方式初始化我的 UIView
。
查看我的UIView
子类实现文件:
#import "CXHostsTableViewCellContentView.h"
@implementation CXHostsTableViewCellContentView
#pragma mark Custom Initializers
-(instancetype)initWithFrame:(CGRect)frame
self = [super initWithFrame:frame];
if (self)
[[NSBundle mainBundle]loadNibNamed:@"CXHostsTableViewCellContentView" owner:self options:nil];
[self setBounds:self.view.bounds];
[self addSubview:self.view];
return self;
-(instancetype)initWithCoder:(NSCoder *)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
[[NSBundle mainBundle]loadNibNamed:@"CXHostsTableViewCellContentView" owner:self options:nil];
[self addSubview:self.view];
return self;
当然还有我的头文件:
#import <UIKit/UIKit.h>
#import "CXStyleView.h"
@interface CXHostsTableViewCellContentView : UIView
#pragma mark UIView Properties
@property (strong, nonatomic) IBOutlet UIView *view;
@property (nonatomic,weak)IBOutlet UIView *standardView;
@end
我还有一个 XIB 文件所有者的 image here 和 IBOutlet
的 another 链接,从基础 UIView
到文件所有者的出口。
好吧,一切看起来都不错,运行这个应该没问题吧?
不,每当我初始化这个子视图并显示它时,我都会崩溃:
CXHostsTableViewCellContentView *scrollContentView = [[CXHostsTableViewCellContentView alloc]init];
我真的不知道如何解决这个问题,因为我确信我正确地遵循了所有这些步骤。我用谷歌搜索了this question,它具有相同的症状,但答案与我正在使用的代码相同,this question 的回复相互矛盾。
我不确定此时该怎么做,或者是什么导致了崩溃。我知道,如果我根本没有连接任何网点,它就可以工作。但话又说回来,也没有任何显示。
【问题讨论】:
您可能需要在崩溃后继续执行,并向我们提供您在控制台中看到的内容(堆栈跟踪、异常详细信息等) @mohamede1945 除了一些关于内存地址的少量信息外,什么都没有。没有明显的名字,也没有突出的数字。 嗨@Owatch,你解决了这个问题吗?我目前正在经历这种情况。 【参考方案1】:我认为当你为你的 scrollContentView 对象分配内存时你会遇到问题。 所以,试着用Frame来分配内存。
即 将其写入 .m 文件
- (void)myAllocation
//do your stuff
- (id)initWithFrame:(CGRect)aRect
self = [super initWithFrame:aRect];
if (self)
[self myAllocation];
return self;
- (id)initWithCoder:(NSCoder*)aDecoder
self = [super initWithCoder:aDecoder];
if (self)
[self myAllocation];
return self;
...
CXHostsTableViewCellContentView *scrollContentView = [[CXHostsTableViewCellContentView alloc] initWithFrame:CGRectMake(0, 10, 0, 20)];
【讨论】:
我不明白您的回复,myAllocation 是什么?这如何解决我的问题? 您好 Owatch,您可以给我发送示例/演示项目吗?所以,我可以帮助你。 我会在 2 小时后发布到这里。 drive.google.com/file/d/0BwYE5uc9NjE-dlNFTGpSUU5WcGM/view这是链接,不小心把它给了之前评论的其他人。我的错。要模拟崩溃,只需打开应用程序并尝试访问菜单外的“主机”屏幕。以上是关于UIView:从自定义 XIB 加载导致崩溃的主要内容,如果未能解决你的问题,请参考以下文章
从 XIB 文件中为 ViewController 视图加载自定义 UIView
来自 XIB 的自定义 UIView 加载具有巨大规模的子视图