我已经厌倦了尝试做这项工作,所以我希望有人能够为我解决这个问题。
我正在使用此代码来转换为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 :(得分: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
}
}