2015-02-28 8 views
0

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

Я использую этот код, чтобы непосредственно перейти к UINavigationController , Этот код РАБОТЫ на тренажере, но НЕ на реальном устройстве:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    static NSString *segueIdentifier = @"ShowDetails"; 

    if ([[segue identifier] isEqualToString:segueIdentifier]) { 

     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 

     UINavigationController *navigationController = segue.destinationViewController; 
     DetailViewController *detailViewController = [navigationController viewControllers][0]; 


     detailViewController.selectedGameIdNumber = [NSString stringWithFormat: @"%ld", (long)indexPath.row]; 
     detailViewController.selectedSection = [self.sectionNames objectAtIndex:indexPath.section]; 
    } 
} 

На реальном устройстве он падает на:

DetailViewController *detailViewController = [navigationController viewControllers][0]; 

с ошибкой:

-[DetailViewController viewControllers]: unrecognized selector sent to instance 

Тогда У меня есть этот код, который я попробовал. Этот код РАБОТЫ на устройстве, но НЕ на тренажере:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    static NSString *segueIdentifier = @"ShowDetails"; 

    if ([[segue identifier] isEqualToString:segueIdentifier]) { 

     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 

     DetailViewController * detailViewController = (DetailViewController *)segue.destinationViewController; 


     detailViewController.selectedGameIdNumber = [NSString stringWithFormat: @"%ld", (long)indexPath.row]; 
     detailViewController.selectedSection = [self.sectionNames objectAtIndex:indexPath.section]; 
    } 
} 

На тренажере он выходит из строя на:

detailViewController.selectedGameIdNumber = [NSString stringWithFormat: @"%ld", (long)indexPath.row]; 

с ошибкой:

-[UINavigationController setSelectedGameIdNumber:]: unrecognized selector sent to instance 0x7fa1d273e8 

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

+0

Какой симулятор/IOS версия и версия устройства/IOS? Я подозреваю, что ответ заключается в том, что вам придется защищать код для обеих ситуаций (т. Е. Проверить класс контроллера представления назначения с помощью 'isKindOfClass:' и обрабатывать каждый случай соответственно). – pbasdf

+0

Цель развертывания установлена ​​в 7.1 для симулятора, и мое устройство работает на IOS 7.1.1 iPhone 5s @pbasdf –

+0

Является ли и симулятор 7.1? (цель развертывания - это нечто иное). Какое устройство моделируется? – pbasdf

ответ

0

Проблема в том, как вы обращаетесь к контроллеру вида. На устройстве иерархия диспетчера представлений отличается от симулятора, и поэтому два решения работают только в своем собственном сценарии. Конечно, это не тот симулятор, который отличается от устройства, которое вы имитируете (предположим, это iPad)

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

Отладка на симуляторе, переключение между типами устройств и по контроллеру вида, и я думаю, вы увидите, что я имею в виду.

0

Вот мое решение: создание общей структуры и создание настраиваемого диспетчера представлений по вызову функции. Преимущество состоит в том, что вы можете повторно использовать эту функцию везде, где она вам нужна. (Хотя мой код в письменной форме в быстры, а не Objective-C, я думаю, что путь решения просто так)

struct DestinationController<T: UIViewController> { 
    func get(segue: UIStoryboardSegue) -> T { 
     if let navigation = segue.destinationViewController as? UINavigationController{ 
      return navigation.viewControllers.first as! T 
     } 
     return segue.destinationViewController as! T 
    } 
} 
Смежные вопросы