0

つまり、StackOverflow に関する別の EXC_BAD_ACCESS トピックですが、私は Objective-C を初めて使用するので、これはまだよく理解していないトピックです。私はすでにそれについて多くの研究を行ってきましたが。

問題は以下です。カスタムクラス( MultiSelectViewUIScrollViewという名前)を使用して上書きしたものがあります。ユーザーがこれをタップすると、データを選択できるビューが開きます。UIScrollView

そのため、メソッドUITapGestureRecognizerを呼び出すa を宣言しました。openMultiSelect:しかし、行[parent.navigationController pushViewController:view animated:YES];Program received signal: "EXC_BAD_ACCESS".エラーが発生します。なになになに?

- (id) initWithCoder:(NSCoder *) coder {
    self = [super initWithCoder: coder];

    if (self) {
        // Add a Tap Gesture Recognizer to the Scrollview.
        // If the user taps the view, it triggers the 'openMultiSelect' method.
        UITapGestureRecognizer *singleTap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(openMultiSelect:)];
        [singleTap setNumberOfTapsRequired:1];
        [singleTap setNumberOfTouchesRequired:1];
        [self addGestureRecognizer:singleTap];
    }

    return self;
}

- (void)openMultiSelect:(UIGestureRecognizer *)gesture {
    //int myViewTag = gesture.view.tag;  // now you know which view called

    DataSelectView *view = [[DataSelectView alloc] initWithNibName:@"DataSelectView" bundle:[NSBundle mainBundle]];
    view.allowMultiSelect = YES;

    [parent.navigationController pushViewController:view animated:YES];
    [view release];
}

表示されるのは、タブを含むViewControllerparentです。これを行うより良い方法はありますか?今のところ、タブを含む ViewController があるためです。そのactivateTab:メソッドでは、このようにタブを作成して渡しますself。カスタムviewDidLoadに渡すために、そのタブで同じことを行います。parentUIScrollView

- (void) activateTab:(int)index {
   ... code ...

   self.tab_Basic = [[TabBasic alloc] initWithNibName:@"TabBasic" bundle: [NSBundle mainBundle]];
   self.tab_Basic.parent = self;

   ... code ...
}
4

2 に答える 2

0

コールバックメソッドに変更を加える必要があります。そんな感じ:

- (void)openMultiSelect:(UIGestureRecognizer *)gesture {
    //int myViewTag = gesture.view.tag;  // now you know which view called
    if(gesture.state == UIGestureRecognizerStateEnded){
        DataSelectView *view = [[DataSelectView alloc] initWithNibName:@"DataSelectView" bundle:[NSBundle mainBundle]];
        view.allowMultiSelect = YES;

        [parent.navigationController pushViewController:view animated:YES];
        [view release];
    }
}
于 2011-07-19T15:53:57.260 に答える
-1

あなたが間違っているのは、オブジェクトの「ビュー」をリリースするのが早すぎることです。ビューがポップされるまでリリースしないでください。これで問題は解決するはずです。

- (void)openMultiSelect:(UIGestureRecognizer *)gesture {
//int myViewTag = gesture.view.tag;  // now you know which view called

DataSelectView *view = [[DataSelectView alloc] initWithNibName:@"DataSelectView" bundle:[NSBundle mainBundle]];
view.allowMultiSelect = YES;

[parent.navigationController pushViewController:view animated:YES];
于 2011-07-19T15:46:37.407 に答える