【问题标题】:trouble popping view controller off of UINavigationController从 UINavigationController 弹出视图控制器时遇到问题
【发布时间】:2009-11-02 15:07:33
【问题描述】:

我在从 UINavigation 控制器中弹出 UIViewController 时遇到问题,即使对导航的引用似乎是正确的,并且 viewControllers 的计数显示正确的数字。

我有一个 UINavController 获取它的第一个 UIViewController 集,然后导航控制器显示在模式视图中:

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 方法中设置了一个取消和保存 UIBarButtonItem,以便取消按钮覆盖导航栏上的默认返回按钮。

- (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

我的问题是,在我想从导航控制器弹出当前视图并返回的 cancelDifficulty 方法中,我不断收到“EXEC_BAD_ACCESS”错误。方法是这样的:

-(IBAction)cancelDifficulty:(id)sender {
    [(UINavigationController *)self.parentViewController popViewControllerAnimated:YES];
}//cancelDifficulty

我已经尝试将方法链接回实际拥有 navController 的类,以及使用 popToViewController:Animated:。如果我使用 NSLog 从 cancelDifficulty 方法中打印出 viewControllers 计数,它会显示正确的数字,但如果我尝试与之交互,我要么得到 EXEC_BAD_ACCESS,要么什么都没有发生。

【问题讨论】:

    标签: iphone objective-c iphone-sdk-3.0


    【解决方案1】:

    为什么不直接访问视图控制器的 navigationController 属性,而不是将其 parentViewController 转换为 UINavigationController(无论如何,这是个坏主意)。

    【讨论】:

    • 如果我尝试使用 self.navigationController 我得到这个错误:-[CALayer retrieveValueForKey:]: unrecognized selector sent to instance 0x3b3b900 Terminating app due to unaught exception 'NSInvalidArgumentException', reason: '*** - [CALayer retrieveValueForKey:]:无法识别的选择器发送到实例 0x3b3b900'
    • 另外,如果我完全删除了我的 viewDidLoad 方法,以便导航控制器应该具有它的开箱即用功能,我仍然会在点击股票返回按钮时得到 EXEC_BAD_ACCESS。
    • 尝试开启 NSZombies,看看你是否可能预释放一个对象。另外,不清楚你是如何设置锻炼导航控制器的,但我会使用 pushViewController:animated:,而不是设置它的 viewControllers 数组。
    • 我认为 NSZombies 正朝着正确的方向前进,最初看起来 popViewControllerAnimated 工作正常,但即将显示的视图的 viewWillAppear 方法正在访问不再可用的对象。谢谢!
    【解决方案2】:

    我会尝试以下方法,看看它是否有效:

    -(IBAction)cancelDifficulty:(id)sender {
        [(UINavigationController *)self.navigationController popViewControllerAnimated:YES];
    }//cancelDifficulty
    

    可能 parentViewController 并不是真正的 UINavigationController

    【讨论】:

    • 同样的事情发生,EXEC_BAD_ACCESS,如果我记录 self.parentViewController 它是一个 UINavigationViewController,如果我记录一个计数 [self.parentViewController viewControllers] 它显示 2 这是正确的。
    • 有时 EXEC_BAD_ACCESS 意味着您正在尝试访问已释放的内存中的某些内容。仔细检查您是否没有过早释放任何您需要的对象。
    • 似乎 EXEC_BAD_ACCESS 是由 popViewControllerAnimated: 方法抛出的。请参阅上面的评论,如果我不覆盖栏按钮项目并使用库存功能,它仍然会失败。 NSLog(@"VCs: %@", [(UINavigationController *)self.parentViewController viewControllers]);注销这个,所以我不知道为什么我不能弹出一个: VCs: ( , )
    猜你喜欢
    • 2011-12-23
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-28
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多