【问题标题】:exc_bad_access code=1 when loading UIView加载 UIView 时 exc_bad_access code=1
【发布时间】:2016-04-28 15:30:00
【问题描述】:

我有一个应用程序,我需要在其中显示一个叠加层以获取反馈。我首先在我想要的 UIViewController 中简单地创建我想要的东西。然而,这带来了两个问题。 1)我不能在另一个视图中重用它(正如我现在需要的那样)和 2)因为它是一个覆盖,它覆盖了故事板上的整个 UIViewController,所以我看不到它下面的控件。

我查看了移动到外部 UIView .xib 文件并动态加载,效果很好,除了我做了什么,我永远无法处理 nib 中的标签来更新文本。

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

我创建了一个非常简单的 .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 方法设置了断点,并且所有信息都被正确传递,所以我认为我非常接近我想要实现的目标。

【问题讨论】:

  • 你不必做[overlay showOverlay];,你可以简单地做[[UIApplication sharedApplication].keyWindow addSubview:overlay];
  • 在 [window addSubview:self] 处设置断点;并打印 self 和 window 的描述,看看这两个是什么?
  • [[UIApplication sharedApplication].keyWindow addSubview: overlay];给出了同样的错误。我断点看看
  • 放一个断点,self是overlayView的实例,window是UIWindow的实例
  • 你在哪里做的[[UIApplication sharedApplication].keyWindow addSubview:overlay]; ?

标签: ios objective-c uiview delegates


【解决方案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;
}

【讨论】:

  • 不客气,如果它解决了你的问题,请批准它作为答案:)
猜你喜欢
  • 1970-01-01
  • 2019-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-04
  • 1970-01-01
相关资源
最近更新 更多