添加NSObject到视图 - NSObject中的UIButton选择器导致崩溃

时间:2012-10-15 11:29:33

标签: iphone xcode uibutton selector nsobject

在ARC环境中遇到一点问题。创建一个NSObject,将视图添加到父视图 - 它基本上是一个“弹出类”,可以处理一些文本并显示它。

在视图控制器中,它被实例化..

CBHintPopup *popup = [[CBHintPopup alloc]init];
[popup showPopupWithText:@"test text" inView:self.view];

和实际的类文件..

CBHintPopup.h

@interface CBHintPopup : NSObject {

}

-(void)showPopupWithText:(NSString *)text inView:(UIView *)view;
-(IBAction)closePopup;

@property (nonatomic, strong) UIView *popupView;
@property (nonatomic, strong) UIImageView *blackImageView;
@property (nonatomic, strong) UIButton *closeButton;

@end

CBHintPopup.m

@implementation CBHintPopup
@synthesize  popupView,blackImageView, closeButton;

-(void)showPopupWithText:(NSString *)text inView:(UIView *)view {

//CREATE CONTAINER VIEW
self.popupView = [[UIView alloc]initWithFrame:CGRectMake((view.frame.size.width/2)-(225/2),-146,225,146)];
self.popupView.alpha = 0;
self.popupView.backgroundColor = [UIColor clearColor];

//CREATE AND ADD BACKGROUND
UIImageView *popupBackground = [[UIImageView alloc]initWithFrame:CGRectMake(0,0,225,146)];
popupBackground.image = [UIImage imageNamed:@"hintbackground.png"];
[self.popupView addSubview:popupBackground];

//CREATE AND ADD BUTTON
self.closeButton = [UIButton buttonWithType:UIButtonTypeCustom];
[self.closeButton addTarget:self action:@selector(closePopup) forControlEvents:UIControlEventTouchUpInside];
[self.popupView addSubview:self.closeButton];

//CREATE AND ADD LABEL
UILabel *popupTextLabel = [[UILabel alloc]initWithFrame:CGRectMake(22,25,176,93)];
popupTextLabel.text = text;
[self.popupView addSubview:popupTextLabel];


[view addSubview:self.popupView];
}

-(void)closePopup {
NSLog(@"HI");
}

通过按下按钮调用closePopup接收以下内容(不打印'HI')..

-[CBHintPopup performSelector:withObject:withObject:]: message sent to deallocated instance 0x246b2fe0

我已经尝试在非ARC中保留按钮以及其他方法但只是没有运气。可能是一些非常简单的东西,但我无法指出它。我已经删除了标签和图像等的所有设置以节省一些空间,因此请忽略alpha等。

感谢你的时间,非常感谢任何帮助。

4 个答案:

答案 0 :(得分:1)

您是否实现了CBHintPopup的构造函数,因为您已经调用了构造函数

[[CBHintPopup alloc]init];

你必须像这样实现构造函数方法

在CBHintPopup的.m文件中

-(id)init{

if(self == [super init]){

// do some initialization here

   }
  return self;

}

答案 1 :(得分:1)

我尝试了你的代码,发现了你提到的崩溃。我找到了解决崩溃问题的解决方案。 我在CBHintPopup *popup;的界面中声明了viewController。并改变了这一行

CBHintPopup *popup = [[CBHintPopup alloc]init];

popup = [[CBHintPopup alloc]init];

一切都很适合我。但我找不到背后的原因。希望这会对你有所帮助。

答案 2 :(得分:0)

确保您保留班级CBHintPopup的对象。

我认为崩溃即将到来,因为CBHintPopup的对象已取消分配。因此找不到动作方法。

答案 3 :(得分:0)

找到了它的修复 - 而不是CBHintPopup是一个NSObject,我只是把它变成了UIView的子类,并将self添加到父视图(而不是self.popupView)。我不会真的称之为“修复” - 更多的替代方法。当然,NSObject可以将UIView(带有UIBUtton)添加到父视图中而没有问题吗?这是一个错误吗?