我有一个应用程序,需要在其中显示叠加层以获取反馈。我首先简单地在所需的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方法,并且所有信息都正确传递了,所以我认为我非常接近要实现的目标。
最佳答案
您需要先启动视图,然后返回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;
}
关于ios - 加载UIView时exc_bad_access代码= 1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36919178/