Как избавиться от EXC_BAD_ACCESS - PullRequest
0 голосов
/ 19 июля 2011

Итак, еще одна тема EXC_BAD_ACCESS о StackOverflow, но, поскольку я новичок в Objective-C, это все еще тема, которую я еще не совсем понял.Хотя я уже провел много исследований по этому поводу.

Проблема заключается в следующем.У меня есть UIScrollView, который я переписал с помощью пользовательского класса (с именем MultiSelectView ).Если пользователь нажимает на UIScrollView, а затем я хочу открыть представление, позволяющее ему выбрать некоторые данные.

Итак, я объявил UITapGestureRecognizer, который вызывает метод 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];
}

Итак, parent, который вы видите, является ViewController, который содержит вкладку.Есть лучший способ сделать это?Потому что сейчас у меня есть ViewController, который содержит вкладки.Таким образом, в методе activateTab: я создаю вкладку и передаю self.Я делаю то же самое в viewDidLoad для этой вкладки, чтобы передать parent в пользовательский UIScrollView:

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

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

   ... code ...
}

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

Вы должны внести некоторые изменения в ваш метод обратного вызова.Примерно так:

- (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];
    }
}
0 голосов
/ 19 июля 2011

То, что вы делаете неправильно, слишком рано высвобождает «представление» объекта, не отпускайте его, пока представление не появится. Это должно решить проблему.

- (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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...