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 的自定义 UIView 的最佳方法

从 XIB 文件中为 ViewController 视图加载自定义 UIView

从自定义 UIView 类设置视图宽度约束不更新帧

来自 XIB 的自定义 UIView 加载具有巨大规模的子视图

为啥从自定义 UIView 向 UIButton 添加子视图不显示添加的子视图?

Xib 自定义 UIView 的实例化