EXC_BAD_ACCESS ошибка при вызове dismissViewControllerAnimated: завершение: (iOS5) - PullRequest
0 голосов
/ 25 марта 2012

Мне очень трудно заставить это работать.У меня есть два контроллера представления со связанными представлениями, названными DomainSelectionViewController и DomainViewController.Я прохожу учебник по сети разработчиков Apple, который охватывает представление контроллеров представления.Я получаю сигнал EXC_BAD_ACCESS при попытке запуска.

Вот соответствующие выдержки из каждого файла:

DomainSelectionViewController.h

@class DomainViewController;

@interface DomainSelectionViewController : UIViewController

- (IBAction)domainSelected:(id)sender;
- (IBAction)leaveDomain;

@property (retain) DomainViewController * selectedDomain;

@end

domainSelected: прикрепляется к кнопке, которая представляет домен.Нажатие на него успешно заменяет текущее представление в интерфейсе представлением, определенным в пере DomainViewController.

DomainSelectionViewController.m

@implementation
- (IBAction)domainSelected:(id)sender {
    NSLog(@"Domain Selected...");
    selectedDomain = [[DomainViewController alloc] initWithNibName:@"DomainView" bundle:nil];
    selectedDomain.domainSelectionContext = self;
    [self presentViewController:selectedDomain animated:NO completion:nil];
}

- (IBAction)leaveDomain {
    NSLog(@"Leaving Domain...");
    NSLog(@"Presented Domain: %@", self.presentedViewController);
    //selectedDomain.modalPresentationStyle = UIModalPresentationFullScreen;
    [self dismissViewControllerAnimated:NO completion:nil];
}

DomainViewController.h

#import <UIKit/UIKit.h>
#import "DomainSelectionViewController.h"

@class DomainSelectionViewController;

@interface DomainViewController : UIViewController

//@property (nonatomic, assign) DomainSelectionViewController * presentingViewController;
@property (nonatomic, retain) DomainSelectionViewController * domainSelectionContext;

@end

DomainViewController.m

- (IBAction)exit:(id)sender {
    NSLog(@"Leaving Domain...");
    if(self.presentingViewController) {
        NSLog(@"  Dismissing View Controller: %@.", self.presentingViewController);
        [self.domainSelectionContext leaveDomain];
        //[self.presentingViewController dismissViewControllerAnimated:NO completion:nil];
        return;
    }
    else {
        NSLog(@"Presenting view controller not set.");
    }
}

Представление домена содержит только одну кнопку, которая читает «назад» и связана с собственным выходом: функция,который, в свою очередь, вызывает метод sendDomain для своего делегата.При нажатии на эту кнопку возникает вызов EXC_BAD_ACCESS.Глядя на другие подобные посты, говорится, что ошибка EXC_BAD_ACCESS обычно возникает при попытке вызвать освобожденный объект, но оператор print незадолго до вызова dismiss показывает, что объекты все еще существуют и на них можно ссылаться.Я надеялся, что кто-то с большим опытом, чем я мог бы взглянуть на это и легко предугадать, что пошло не так.

Для полноты, вот вывод из консоли:

Attaching to process 26860.
2012-03-24 19:23:45.601 domaintest[26860:f803] DomainSelectionView Initialized.
2012-03-24 19:23:52.627 domaintest[26860:f803] Domain Selected...
2012-03-24 19:24:14.187 domaintest[26860:f803] Leaving Domain...
2012-03-24 19:24:14.188 domaintest[26860:f803]   Dismissing View Controller: <DomainSelectionViewController: 0x688f9a0>.
2012-03-24 19:24:14.188 domaintest[26860:f803] Leaving Domain...
2012-03-24 19:24:14.188 domaintest[26860:f803] Presented Domain: <DomainViewController: 0x6891d90>
Current language:  auto; currently objective-c
warning: Attempting to create USE_BLOCK_IN_FRAME variable with block that isn't in the frame.
(gdb)

Ответы [ 2 ]

1 голос
/ 05 апреля 2012

Таким образом, после небольшого количества проб и ошибок, проблема здесь была выше в иерархии представлений.В дизайне был корневой контроллер представления, который был полностью пустым, который заменил свое собственное представление на представление первого (DomainSelectionViewController) контроллера

self.window.rootViewController.view = domainSelectionViewController.view;

Конечным результатом этого является то, что domainSelectionViewController может представлять представление domainViewController, но пытаетсяотклонить это привело к EXC_BAD_ACCESS.Я до сих пор не совсем уверен, почему, но я изменил его так, чтобы domainSelectionViewController был основным видом, или наличие rootViewController present domainSelectionViewController в ViewDidAppear устранило проблему.

0 голосов
/ 25 марта 2012

О, хорошо, вот твоя проблема.

Вы вызываете функцию:

[self dismissViewControllerAnimated:NO completion:nil];

Эта функция должна быть включена в новый контроллер представления, который вы пытаетесь отобразить, а не в исходном представлении, поскольку вы пытаетесь уничтожить представление root .

Вместо этого сделайте следующее:

DomainSelectionViewController.m

- (IBAction)leaveDomain {
    NSLog(@"Leaving Domain...");
    NSLog(@"Presented Domain: %@", self.presentedViewController);
    //selectedDomain.modalPresentationStyle = UIModalPresentationFullScreen;
}

DomainViewController.m

- (IBAction)exit:(id)sender {
    NSLog(@"Leaving Domain...");
    if(self.presentingViewController) {
        NSLog(@"  Dismissing View Controller: %@.", self.presentingViewController);
        [self.domainSelectionContext leaveDomain];
        //ADD THIS HERE
        [self dismissViewControllerAnimated:NO completion:nil];

        return;
    }
    else {
        NSLog(@"Presenting view controller not set.");
    }
* *} Тысяча двадцать-один

Таким образом, вы избавляетесь от контроллера представления, который вы представляете. Использование self.presentingViewController также не будет работать, потому что родительский контроллер представления является тем, который вы хотите отклонить, чтобы увидеть представление выбора под ним; Отказ от представленного контроллера оставит вас с белым экраном.

Надеюсь, это поможет вам и удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...