gpt4 book ai didi

ios - PopViewController 奇怪的行为

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:50:13 27 4
gpt4 key购买 nike

由于我试图拒绝但没有成功的奇怪请求,我不得不覆盖导航栏的后退按钮。

我制作了一个自定义的 UINavigationController 子类并破解了- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item 方法。

这是我的代码:

@interface CustomUINavigationController ()

@end

@implementation CustomUINavigationController


#pragma mark - UINavigationBar delegate methods

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item {

if ([[self.viewControllers lastObject] isKindOfClass:[ViewController1 class]]) {
ViewController1 *vc1 = (ViewController1 *)[self.viewControllers lastObject];
[vc1 handleBackAction];
if (vc1.canPopVC == YES) {
[self popViewControllerAnimated:YES];
return YES;
} else {
return NO;
}
}

[self popViewControllerAnimated:YES];
return YES;
}

@end

一切正常,除非我以编程方式弹出 viewController。每当我想在所说的弹出之后执行推送时,应用程序都会崩溃。打开 NSZombie,显示当以编程方式弹出 viewController 时,其父 viewController 被释放。在这一点上,制作自定义 backButton 不是一个选项,因为它会失去原生 iOS 7 滑动到 popViewController 功能。

崩溃日志:

*** -[ContactsDetailViewController performSelector:withObject:withObject:]: message sent to deallocated instance 0x1806b790

最佳答案

(我以前的帖子是完全错误的。这是一个完整的重写,有一个适当的解决方案。)

当我选择删除一些在我转换为 ARC 时生成警告的代码时,出现了这种行为——我认为没有被调用的代码。

情况是这样的:

如果您在 UINavigationController 的子类中隐藏 navigationBar:shouldPopItem:,则当用户触摸 NavBar 的 BACK 按钮时,当前 View Controller 将不会弹出。但是,如果您直接调用 popViewControllerAnimated:,您的 navigationBar:shouldPopItem: 仍会被调用,并且 View Controller 会弹出。

这就是当用户触摸 BACK 按钮时 View Controller 无法弹出的原因:

UINavigationController 有一个名为navigationBar:shouldPopItem: 的隐藏方法。当用户单击 BACK 按钮时调用此方法,它是通常在用户触摸 BACK 按钮时调用 popViewControllerAnimated: 的方法。

当您隐藏 navigationBar:shouldPopItem: 时,不会调用父类(super class)的实现,因此不会弹出 ViewController。

为什么你不应该在你的子类中调用 popViewControllerAnimated: navigationBar:shouldPopItem::

如果您在 navigationBar:shouldPopItem: 中调用 popViewControllerAnimated:,您将在单击 NavBar 上的 BACK 按钮时看到您想要的行为:您可以确定是否或者你不想弹出,如果你想要的话,你的 View Controller 会弹出。

但是,如果您直接调用 popViewControllerAnimated:,您最终会弹出两个 View Controller :一个来自您对 popViewControllerAnimated: 的直接调用,一个来自调用您添加到 navigationBar:shouldPopItem: 中。

我认为安全的解决方案:

你的自定义导航 Controller 应该这样声明:

@interface CustomNavigationController : UINavigationController <UINavigationBarDelegate> 
{
// .. any ivars you want
}
@end

您的实现应包含如下所示的代码:

// Required to prevent a warning for the call [super navigationBar:navigationBar shouldPopItem:item]
@interface UINavigationController () <UINavigationBarDelegate>
@end


@implementation CustomNavigationController

- (BOOL)navigationBar:(UINavigationBar *)navigationBar shouldPopItem:(UINavigationItem *)item
{
BOOL rv = TRUE;

if ( /* some condition to determine should NOT pop */ )
{
// we won't pop
rv = FALSE;

// extra code you might want to execute ...
} else
{
// It's not documented that the super implements this method, so we're being safe
if ([[CustomNavigationController superclass]
instancesRespondToSelector:@selector(navigationBar:shouldPopItem:)])
{
// Allow the super class to do its thing, which includes popping the view controller
rv = [super navigationBar:navigationBar shouldPopItem:item];

}
}

return rv;
}

关于ios - PopViewController 奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20327165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com