prepareForSegue在模拟器上工作但不在设备上工作

时间:2015-02-28 12:34:04

标签: ios objective-c uinavigationcontroller segue

我已经厌倦了尝试做这项工作,所以我希望有人能够为我解决这个问题。

我正在使用此代码来转换为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

我做错了什么或者我应该使用适用于真实设备的第二个代码? 我想要一个干净的解决方案,所以如果我做错了什么请赐教。谢谢大家。

2 个答案:

答案 0 :(得分:0)

问题在于您如何访问视图控制器。在设备上,视图控制器层次结构与模拟器上的不同,因此这两种解决方案都只能在自己的场景中工作。当然不是模拟器不同,而是你正在模拟的设备(猜猜是iPad)

请注意,特别是对于splitViewcontrollers,以及其他框架提供的视图控制器,控制器的功能可能会因目标设备而异。当你对视图控制器的索引等做出假设时,这种变化经常会让你感到厌烦。

在模拟器上进行调试,在设备类型之间切换并对视图控制器进行调整,我想你会明白我的意思。

答案 1 :(得分:0)

这是我的解决方案:创建一个通用结构并通过函数调用强制转换自定义视图控制器。优点是您可以在任何需要的地方重复使用此功能。 (虽然我的代码是用swift而不是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
    }
}