Iphone 从UINavigationController弹出视图控制器时出现问题
我在从UINavigation控制器弹出UIViewController时遇到问题,即使对导航的引用似乎是正确的,并且ViewController上的计数显示了正确的数字 我有一个UIAVController,它获取了它的第一个UIViewController集,然后nav控制器显示在模式视图中:Iphone 从UINavigationController弹出视图控制器时出现问题,iphone,objective-c,iphone-sdk-3.0,Iphone,Objective C,Iphone Sdk 3.0,我在从UINavigation控制器弹出UIViewController时遇到问题,即使对导航的引用似乎是正确的,并且ViewController上的计数显示了正确的数字 我有一个UIAVController,它获取了它的第一个UIViewController集,然后nav控制器显示在模式视图中: workoutNavController.viewControllers = [NSArray arrayWithObject:manageWorkoutController]; [self pres
workoutNavController.viewControllers = [NSArray arrayWithObject:manageWorkoutController];
[self presentModalViewController:workoutNavController animated:YES];
第一个UIViewController(manageWorkoutController)有一个表视图,当触摸其中一个单元格时,第二个UIViewController被推到导航控制器上:
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.row) {
case 0:
//do nothing no nav-view here
break;
//DIFFICULTY
case 1:
workoutDifficultyController.title = @"Workout Difficulty";
[(UINavigationController *)self.parentViewController pushViewController:workoutDifficultyController
animated:YES];
break;
//DATE
case 2:
workoutDateController.title = @"Workout Date";
[(UINavigationController *)self.parentViewController pushViewController:workoutDateController
animated:YES];
break;
default:
break;
}//end switch
}//end didSelectRowAtIndexPath
在第二个UIViewController(workoutDifficultyController)中,我在viewDidLoad方法中设置了一个Cancel and Save UIBarButtonItem,以便Cancel按钮覆盖导航栏上的默认后退按钮
- (void)viewDidLoad {
UIBarButtonItem *cancelButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancelDifficulty:)];
[self.navigationItem setLeftBarButtonItem:cancelButton];
[cancelButton release];
UIBarButtonItem *saveButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(saveDifficulty:)];
[self.navigationItem setRightBarButtonItem:saveButton];
[saveButton release];
[super viewDidLoad];
}//end viewDidLoad
我的问题是,在Cancel方法中,我想将当前视图从导航控制器弹出并返回,我一直会遇到“EXEC\u BAD\u ACCESS”错误。方法如下:
-(IBAction)cancelDifficulty:(id)sender {
[(UINavigationController *)self.parentViewController popViewControllerAnimated:YES];
}//cancelDifficulty
我尝试了将方法链接回实际拥有navController的类,以及使用popToViewController:Animated:。如果我使用NSLog打印出CancelDemobility方法中的ViewController计数,它会显示正确的数字,但如果我尝试与它交互,我要么获得EXEC_BAD_访问权限,要么什么也没有发生。为什么不访问视图控制器的navigationController属性,与其将其parentViewController强制转换为UINavigationController(无论如何,这是一个坏主意)。我将尝试以下方法,看看它是否有效:
-(IBAction)cancelDifficulty:(id)sender {
[(UINavigationController *)self.navigationController popViewControllerAnimated:YES];
}//cancelDifficulty
可能是parentViewController不是一个真正的UINavigationController如果我记录self.parentViewController,它就是一个UINavigationViewController,如果我记录了[self.parentViewController ViewController]的计数,会发生同样的情况有时EXEC\u BAD\u ACCESS表示您试图访问内存中已释放的某个内容。仔细检查是否未过早释放任何需要的对象。似乎是popViewControllerAnimated:方法引发了EXEC_BAD_访问。请参阅上面的注释,如果我不覆盖工具栏按钮项并使用库存功能,它仍然会失败。NSLog(@“VCs:%@,[(UINavigationController*)self.parentViewController视图控制器]);注销此项,因此我不确定为什么无法弹出一个:VCs:(,)如果我尝试使用self.navigationController,我会收到以下错误:-[CALayer retrieveValueForKey:]:由于未捕获的异常“NSInvalidArgumentException”,原因:'***-[CALayer retrieveValueForKey:]将无法识别的选择器发送到实例0x3B3900终止应用程序:未识别的选择器发送到实例0x3b3b900'此外,如果我完全删除viewDidLoad方法,使导航控制器具有开箱即用功能,则在点击“后退”按钮时,我仍然可以访问EXEC_BAD_。请尝试打开NSZombies,并查看是否有可能预释放对象。另外,还不清楚您是如何设置workoutNavController的,但我会使用pushViewController:animated:,而不是设置其ViewController数组。我认为NSZombies的方向是正确的,一开始似乎popViewControllerAnimated工作正常,但是,即将显示的视图的ViewWillAspect方法正在访问一个不再可用的对象。谢谢