1

UITapGestureRecognizer を何度も使用しましたが、この場合、タップが発生したときに EXC_BAD_ACCESS を取得しています。アラート タイプのオーバーレイ ビューに追加していることが関係していると思います。また、何らかの理由でオーバーレイ ビューが画面上に表示されていても保持されません。

私はこのようなビューを作成しています:

HelperView *testHelper = [HelperView helperWithBodyText:@"test text"];
[testHelper presentAtPoint:screenCenter];

HelperView.m の簡易メソッドは次のようになります。

+ (id)helperWithBodyText:(NSString*)text
{
    return [[self alloc] initWithFrame:CGRectZero bodyText:text];
}

残りのコードは次のようになります。

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        self.container = [[AGWindowView alloc] initAndAddToKeyWindow];
        self.container.supportedInterfaceOrientations = UIInterfaceOrientationMaskLandscapeRight;

        self.overlay = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        self.overlay.backgroundColor = [UIColor redColor];
        self.overlay.alpha = 0.6;
        [self.container addSubviewAndFillBounds:self.overlay]; //this fills the screen with a transparent red color, for testing

        UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissMe:)];
        [self.overlay addGestureRecognizer:tap]; //I want to dismiss the whole view if the overlay is tapped

        self.content = [[UIView alloc] initWithFrame:CGRectZero];
    }
    return self;
}

- (id)initWithFrame:(CGRect)frame bodyText:(NSString*)bodyText
{
    self = [self initWithFrame:frame];
    if (self) {

        //TEST frame
        self.content.frame = CGRectMake(0, 0, 217, 134);

        // Initialization code
        UIImage *bgImage = [[UIImage imageNamed:@"helper-bg"]
                                resizableImageWithCapInsets:UIEdgeInsetsMake(30, 28, 20, 20)];
        UIImageView *bgImgView = [[UIImageView alloc] initWithImage:bgImage];
        bgImgView.bounds = self.content.frame;
        [self.content addSubview:bgImgView];

}
    return self;
}

- (void)presentAtPoint:(CGPoint)loc
{
    CGPoint newPoint = [self.container convertPoint:loc toView:self.container];

    self.content.center = newPoint;
    [self.container addSubview:self.content];

}


- (void)dismissMe:(UITapGestureRecognizer*)recognizer
{
    //this never happens - I get EXC_BAD_ACCESS when I tap the overlay
}
4

1 に答える 1

1

HelperView は表示されるビューではなく、保持されませんが、ジェスチャ認識エンジンのターゲットとして使用しています。AGWindowView プロパティの「コンテナ」が表示され、そのスーパービューによって保持されます。このビュー HelperView 自体は何も表示しないため、コードをリファクタリングする必要がありますが、このように機能させたい場合は、自動的に解放されないように HelperView を保持する必要があります。これを行うには、強力なインスタンス変数に割り当てます。

于 2013-08-22T18:51:50.563 に答える