加载UIView时,exc_bad_access代码= 1

时间:2016-04-28 15:30:01

标签: ios objective-c uiview delegates

我有一个应用,我需要提供叠加反馈。我开始只是在我想要的UIViewController中创建我想要的东西。然而,这提出了两个问题。 1)我无法在另一个视图中重复使用它(我现在需要)和2)因为它是一个叠加层,它覆盖了故事板上的整个UIViewController,因此我无法看到控件在它下面。

我看着移动到外部UIView .xib文件并动态加载哪个工作得很好,除了我做的任何事情,我都无法处理笔尖内的标签以更新文本。

然后我决定将它作为一个类并为它创建一个委托方法可能是最好的前进方法。

我已经创建了一个非常简单的.xib,并将它和.h和.m文件(overlayView)一起布局并将其全部连接起来看起来不错,除非在尝试呈现overlayView时我得到了一个exc_bad_access这条线

[window addSubview:self];

我无法解决原因。完整代码如下:

overlayView.h

#import <UIKit/UIKit.h>

@class overlayView;

@protocol overlayDelegate;

@interface overlayView : UIView

@property (nonatomic, strong) id <overlayDelegate> delagate;

-(instancetype)initWithTitle:(NSString *)title
                dateFrom:(NSString *)dateFrom
                  dateTo:(NSString *)dateTo
             description:(NSString *)description;

@property (strong, nonatomic) IBOutlet UILabel *overlayTitleLbl;
@property (strong, nonatomic) IBOutlet UILabel *overlayDateFromLbl;
@property (strong, nonatomic) IBOutlet UILabel *overlayDateToLbl;
@property (strong, nonatomic) IBOutlet UILabel *overlayDescLbl;
@property (strong, nonatomic) IBOutlet UILabel *overlayIcon;

-(void)showOverlay;
-(void)dismissOverlay;

@end

@protocol overlayDelegate <NSObject>

@optional

@end

overlayView.m

#import "overlayView.h"
#import "NSString+FontAwesome.h"

@implementation overlayView


- (instancetype)initWithTitle:(NSString *)title dateFrom:(NSString *)dateFrom dateTo:(NSString *)dateTo description:(NSString *)description {
self.overlayViewTitleLbl.text = title;
self.overlayViewDateFromLbl.text = dateFrom;
self.overlayViewDateToLbl.text = dateTo;
self.overlayViewDescLbl.text = description;
self.overlayViewIcon.text = [NSString fontAwesomeIconStringForIconIdentifier:@"fa-calendar"];

return self;
}

-(void)showOverlay {

UIWindow *window = [[UIApplication sharedApplication] keyWindow];
[window addSubview:self]; <-- Code causing issue
[window makeKeyAndVisible];

}

-(void)dismissOverlay {
  // Not wired in yet  
}

@end

在我的主视图控制器中调用,如:

overlay = [[overlayView alloc] initWithTitle:[tmpDict objectForKeyedSubscript:@"Title"] dateFrom:startDate dateTo:stopDate description:[tmpDict objectForKeyedSubscript:@"Desc"]];

[overlay showOverlay];

为什么这不想打球的任何想法?我已经打破了initWithTitle方法,所有信息都正确传递,所以我认为我非常接近我想要实现的目标。

1 个答案:

答案 0 :(得分:1)

您需要先发起自己的观点,然后在不启动的情况下返回self

- (instancetype)initWithTitle:(NSString *)title dateFrom:(NSString *)dateFrom dateTo:(NSString *)dateTo description:(NSString *)description {
self = [super init]; 
if (self) {
     self.overlayViewTitleLbl.text = title;
     self.overlayViewDateFromLbl.text = dateFrom;
     self.overlayViewDateToLbl.text = dateTo;
     self.overlayViewDescLbl.text = description;
     self.overlayViewIcon.text = [NSString fontAwesomeIconStringForIconIdentifier:@"fa-calendar"];
   }
return self;
}