我有一个应用程序,需要在其中显示叠加层以获取反馈。我首先简单地在所需的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/

10-09 09:15