3

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以外で保持しようとしましたが、他の方法はたくさんありましたが、うまくいきませんでした。おそらく本当に単純なことですが、私はそれを釘付けにすることはできません。スペースを節約するために、ラベルや画像などの設定をすべて削除したので、アルファなどは無視してください。

お時間をいただきありがとうございます。

4

4 に答える 4

1

私はあなたのコードを試しましたが、あなたが言及したクラッシュを見つけました。クラッシュを修正するための解決策を見つけました。のインターフェイスでを宣言しCBHintPopup *popup;ました。viewControllerそしてこの行を変更しました

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

popup = [[CBHintPopup alloc]init];

すべてがうまくいきました。しかし、その理由はわかりませんでした。これがお役に立てば幸いです。

于 2012-10-18T16:36:23.483 に答える
1

CBHintPopupコンストラクターを呼び出したので、コンストラクターを実装しましたか

[[CBHintPopup alloc]init];

このようなコンストラクタメソッドを実装する必要があります

CBHintPopup の .m ファイル内

-(id)init{

if(self == [super init]){

// do some initialization here

   }
  return self;

}
于 2012-10-15T12:00:13.873 に答える
0

それに対する修正が見つかりました - CBHintPopup が NSObject である代わりに、単にそれを UIView のサブクラスにして、(self.popupView の代わりに) 親ビューに self を追加しました。ただし、これを「修正」とは呼びません-代替方法です。確かに、NSObject は UIView (UIBUtton を使用) を親ビューに問題なく追加できますか? これはバグですか?

于 2012-10-15T12:31:13.930 に答える
0

class のオブジェクトを保持していることを確認してくださいCBHintPopup

オブジェクトの割り当てが解除されるため、クラッシュが発生していると思いCBHintPopupます。したがって、アクション メソッドが見つかりません。

于 2012-10-15T11:34:19.937 に答える