2013-04-10 2 views
4

Я написал пользовательское приложение для своего приложения, которое частично скрывает контроллер представления исходного кода. Segue отлично работает, и я получаю желаемый эффект. Когда я нажимаю кнопку, чтобы отключить переход к контроллеру источника, приложение выйдет из строя. Я помещаю несколько операторов журнала в различные методы, но ничего не вызывается, поэтому я думаю, что неправильно подключил представления. Ниже приведен код списания:Пользовательская кнопка «Сбой назад» вызывает приложение

- (void)perform { 
NSLog(@"performing!"); 
UIView *sourceView = ((UIViewController *)self.sourceViewController).view; 
UIView *destView = ((UIViewController *)self.destinationViewController).view; 
UIViewController *sourceController = ((UIViewController *)self.sourceViewController); 

if (!_rewinding) { 
[sourceView.window insertSubview:destView aboveSubview:sourceView]; 
    destView.center = CGPointMake(sourceView.frame.size.width * 1.5, sourceView.center.y); 
} 

CGPoint newSourceCenter = CGPointMake(sourceView.frame.origin.x - sourceView.frame.size.width * 0.4, sourceView.center.y); 
CGPoint newDestCenter = CGPointMake(sourceView.center.x + sourceView.frame.size.width * 0.1, sourceView.center.y); 


[UIView animateWithDuration:1.4 
       animations:^{ 
        if (_rewinding) { 
         NSLog(@"rewind in segu"); 
         destView.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2, destView.center.y); 
         sourceView.center = CGPointMake([UIScreen mainScreen].bounds.size.width*1.5, sourceView.center.y); 
         destView.alpha = 1.0; 
        } else { 
         destView.center = newDestCenter; 
         sourceView.center = newSourceCenter; 
         sourceView.alpha = 0.5; 
        } 
       } completion:^(BOOL finished) { 
        if (_rewinding) 
        NSLog(@"completed animation"); 
       }]; 
} 

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

main/source viewafter segue

Я попытался с помощью [source presentViewController:dest] но делать это удаляет исходный вид из окна. Поскольку я частично скрываю источник, он должен оставаться на экране после анимации. Каков правильный способ установить это?

Редактировать: С включенными зомби я получил это в журнале. Это соответствует целевому контроллеру. Поэтому ясно, что он не сохраняется во время сеанса.

[58880:c07] *** -[UIStoryboardUnwindSegueTemplate performSelector:withObject:withObject:]: message sent to deallocated instance 0x1f3c7fe0 
+0

Какая именно авария? Можете ли вы разместить символический журнал аварий? –

+0

@RoboticCat Crash, возможно, не было правильным словом для использования. Я получаю EXC_BAD_ACCESS. Я работаю над созданием журнала того, что происходит. – brodney

+0

Чтобы быть ясным: вы говорите, что 0x1f3c7fe0 соответствует предыдущему экземпляру диспетчера представлений, к которому вы сейчас обращаетесь? Я был бы поражен, если бы диспетчер представлений был освобожден, но если это так, я не уверен, как выследить эту ошибку. –

ответ

1

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

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

- (void)showModalDetailView { 
NSLog(@"show modal"); 
if (!self.detailViewController) { 
    self.detailViewController = (SegmentDetailViewController *)[[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil] instantiateViewControllerWithIdentifier:@"segDetail"]; 
    self.detailViewController.view.center = CGPointMake(self.view.frame.size.width * 1.5, self.view.center.y); 
    [self.view.superview addSubview:self.detailViewController.view]; 
    self.detailViewController.delegate = self; 
} 

CGPoint newSourceCenter = CGPointMake(self.view.frame.origin.x - self.view.frame.size.width * 0.4, self.view.center.y); 
CGPoint newDestCenter = CGPointMake(self.view.center.x + self.view.frame.size.width * 0.1, self.view.center.y); 

[UIView animateWithDuration:1.4 
       animations:^{ 
        if (self.shouldRewind) { 
         self.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width/2, self.view.center.y); 
         self.detailViewController.view.center = CGPointMake([UIScreen mainScreen].bounds.size.width*1.5, self.detailViewController.view.center.y); 
         self.view.alpha = 1.0; 
         self.shouldRewind = NO; 
         self.detailViewController = nil; 
        } else { 
         self.detailViewController.view.center = newDestCenter; 
         self.view.center = newSourceCenter; 
         self.view.alpha = 0.5; 
         self.shouldRewind = YES; 
        } 
       } completion:^(BOOL finished) { 
        NSLog(@"animation complete"); 

       }]; 

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