2013-07-04 3 views
1

В моем недавнем проекте я использовал presentviewController для организации переключения видов. Но есть странная проблема.Сбой с участием presentViewController

Сначала я написал демо-версию на git-хабе: test present view. Надеюсь, это затруднит понимание проблемы.

Во-вторых, я показываю, что я сделал в демо: 1) Контроллер вид корень T1RootViewController, он имеет свойство:

@property (strong, nonatomic) T1TopViewController1 *top1VC;
При загрузке, он добавляет T1TopViewController1 в качестве единственного подвид:
self.top1VC = [[T1TopViewController1 alloc] initWithNibName:@"T1TopView1" bundle:nil]; 
[self.view addSubview:self.top1VC.view];

2) T1TopViewController1 обладает свойством:

@property (strong, nonatomic) T1TopViewController2 *topVC2;
он также имеет кнопку, которая настоящий T1TopViewController2, когда она нажата:
self.topVC2 = [[T1TopViewController2 alloc] initWithNibName:@"T1TopView2" bundle:nil]; 
[self presentViewController:self.topVC2 animated:NO completion:nil];

3) T1TopViewController2 почти такой же, как T1TopViewController1, за исключением того, что она представляет T1TopViewController3

4) T1TopViewController3 имеет одну кнопку, которая будет идти назад, чтобы показать T1TopViewController1 при нажатии:

UIWindow *rootWin = [[UIApplication sharedApplication] keyWindow]; 
T1RootViewController *rootVC = (T1RootViewController *)rootWin.rootViewController; 
[rootVC.top1VC dismissViewControllerAnimated:NO completion:nil];

Затем запустите это приложение, из T1TopViewController1, нажмите кнопку на каждом представлении до появления T1TopViewController3. Затем нажмите кнопку T1TopViewController3, это вернется к T1TopViewController1. Затем снова нажмите кнопку на T1TopViewController1. Теперь может возникнуть проблема:
1) КСН 5 имитатор, все прекрасно
2) КСН 6,1 тренажере или устройства, это будет крах, с бревном:
тест [699: c07] * - [T1TopViewController2 isKindOfClass:]: сообщение отправлено на освобожденный экземпляр 0x75ade30

Я действительно не знаю, что не так с моим кодом и как его исправить. Я буду очень благодарен за любую помощь.

p.s. Окружение dev - это mac os x 10.8.4, xcode 4.6.3. Проект позволяет ARC.

ответ

0

Я запустил приложение и увидел там некоторые странные вещи: у вас есть UIViewController как RootViewController, а затем вы инициализируете другой UIViewController и добавляете его UIView в представление RootViewController.

Во всяком случае вот что я сделал:

Вы можете изменить код из AppDelegate к этому:

T1TopViewController1 *cont = [[T1TopViewController1 alloc] initWithNibName:@"T1TopView1" bundle:nil]; 
self.window.rootViewController = cont; 

вместо того, что у вас было.

и функция:

- (IBAction)backBtn_onTouchUpInside:(id)sender 
{ 
UIWindow *rootWin = [[UIApplication sharedApplication] keyWindow]; 
[rootWin.rootViewController dismissViewControllerAnimated:NO completion:nil]; 
} 

из T1TopViewController3

Теперь вы можете изменить контроллеры столько, сколько вы хотите.

0

Я понятия не имею, почему ваш код не работает. Но я нашел способ добиться того, что вы хотите сделать в своем тестовом проекте. Если вы обмениваетесь действие кнопки в T1TopViewController3 для

- (IBAction)backBtn_onTouchUpInside:(id)sender 
{ 
    UIViewController *presentingViewController = self.presentingViewController; 
    [self dismissViewControllerAnimated:NO completion:^{ 
     [presentingViewController dismissViewControllerAnimated:NO completion:nil]; 
    }]; 
} 

он должен работать.

Смежные вопросы