首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用UINavigationController时,不调用我的控制器的viewWillAppear或viewDidAppear方法

在使用UINavigationController时,如果不调用控制器的viewWillAppear或viewDidAppear方法,可能是因为导航控制器的代理设置不正确,或者控制器的生命周期方法没有被正确实现。以下是一些建议和解决方案:

  1. 确保导航控制器的代理已经设置为正确的对象。通常,这应该是控制器的实例,如下所示:
代码语言:swift
复制
class MyViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        navigationController?.delegate = self
    }
}

extension MyViewController: UINavigationControllerDelegate {
    // 实现代理方法
}
  1. 确保控制器的生命周期方法已经正确实现。在控制器的实例中,应该实现viewWillAppear和viewDidAppear方法,如下所示:
代码语言:swift
复制
class MyViewController: UIViewController {
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        // 在这里执行代码,当控制器的视图将要出现时
    }

    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        // 在这里执行代码,当控制器的视图已经出现时
    }
}
  1. 如果仍然不能解决问题,可以尝试在控制器的viewDidLoad方法中添加一个断点,以便在调试时查看是否调用了该方法。如果viewDidLoad方法没有被调用,可能是导航控制器的栈中没有正确地添加控制器实例。
  2. 如果以上方法都无法解决问题,可以尝试使用其他导航控制器库,如Hero等,以替代UINavigationController。

总之,要解决这个问题,需要确保导航控制器的代理设置正确,控制器的生命周期方法已经正确实现,并且在调试时使用断点来查看是否调用了这些方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Cocoa编程中视图控制器与视图类详解

使用pushViewController: animated:可推入一个新控制器,从而增加新项到导航栈。(记住:导航栏控制器添加一个视图进去,这个导航栏是没有意义!)...主要方法 • –loadView:不要主动调用方法,当访问控制器view时候,就会调用方法。如果要自己创建view,则需要重写该方法。...• –viewDidLoad:当加载控制器视图到内存,该方法调用。...控制器加载视图过程 当调用视图控制器view属性,视图控制器会先调用loadView方法加载视图,因此,可以在loadView方法中创建所有的视图,这是比较好编程惯例。...接着会调用视图viewLoad->viewWillAppear->viewDidAppear. 6. 控制器视图消失过程    消失过程比较简单,不作说明。 7.

5K50

Objective-C 运行时中最具争议黑魔法:Method Swizzling

例如:我们想要在一款 iOS app 中追踪每一个视图控制器被用户呈现了几次: 这可以通过在每个视图控制器 viewDidAppear: 方法中添加追踪代码来实现,但这样会大量重复样板代码。...继承是另一种可行方式,但是这要求所有被继承视图控制器如 UIViewController, UITableViewController, UINavigationController 都在 viewDidAppear...现在,UIViewController 其子类实例对象在调用 viewWillAppear: 时候会有 log 输出。...Selector 是一个在运行时被注册(映射)C类型字符串。Selector由编译器产生并且在当类被加载进内存由运行时自动进行名字和实现映射。...由于 xxx_viewWillAppear: 这个方法实现已经被替换为了 viewWillAppear: 实现,所以,当我们在这个方法中再调用 viewWillAppear: 便会造成递归循环。

45110
  • UI篇-VC生命周期以及UIViewlayoutSubviews和drawRect方法

    控制器view将要显示 viewWillLayoutSubviews:控制器view将要布局子控件 viewDidLayoutSubviews:控制器view布局子控件完成 viewDidAppear...之后 viewDidAppear 之前执行,这个方法会被调用多次,如果在此创建视图,可能会创建多个,而且这个方法中执行耗时操作依然会造成跳转卡顿问题。...中了,而一个 VC 执行viewWillAppear 必定是 self.navigationController topViewController即栈顶视图。...那么将在每次设置更改frame时候自动调用drawRect:。...**drawRect:方法不能手动显示调用,必须通过调用setNeedsDisplay 者 setNeedsDisplayInRect,让系统自动调该方法。强行调用也不会起作用

    1.9K30

    ViewController及View生命周期1. 起因2. Controller生命周期3. View生命周期4. 内存警告

    意思是说viewDidLoad在视图被加载后调用。如果使用了布局文件,那么会在布局文件加载后被调用。...iOS7新增加了导航控制器侧滑手势,当触发侧滑返回,会调用系统viewWillDisappear:方法,取消侧滑返回又会调用viewWillAppear:方法。...: isMovingFromParentViewController 会在viewWillDisappear & viewDidDisappear 方法内部调用这个方法判断视图控制器视图隐藏是否因为视图控制器从它容器视图控制器移除...isBeingDismissed 会在viewWillDisappear & viewDidDisappear 方法内部调用这个方法判断视图控制器视图隐藏是否因为视图控制器被清退 (dismissed...View生命周期 我们知道view创建有init(new或者跟类名一样)方法,销毁时会自动执行dealloc方法,但是UIView生命周期到底是怎样呢?

    1.4K30

    iOS系统中导航栏转场解决方案与最佳实践

    值得注意地方有两点: 第一个是 UINavigationController 作为 UINavigationBar 代理,在没有特殊需求情况下,不应该修改其代理方法,这里是通过符号断点获取它们调用顺序...除了上面说到两点,pop 过程中还需要注意一点,那就是从 B 返回到 A 过程中,A 视图控制器 viewDidLoad 方法并不会被调用。...试想一下,当我们页面会跳到不同地方,我们是不是要在 viewWillAppear: 和 viewWillDisappear: 方法里面写上一堆判断呢?...,在视图控制器 viewDidLoad 或者 viewWillAppear: 方法里去设置导航栏样式。...从大方向上来看,美团使用是前面所说第三种方案,不过它也有一些自己独特地方,为了更好让大家理解整个过程,我们设计这样一个场景,从页面 A push 到页面 B,结合之前探讨过方法调用顺序,我们可以知道几个核心方法调用顺序大致如下

    2.4K30

    UI篇-UINavigationController之易忘补充

    ---- 对nextVC 进行属性赋值后,执行push跳转,方法执行顺序:  A跳转到B 代码顺序执行: Binit 方法;(此方法中  BnavigationController 不存在...B属性赋值方法; A中当前方法中Push 操作; A中当前方法剩余操作; A viewWillDisappear B viewDidLoad B viewWillAppear 导航push...设置导航栏背景图片 (多见于导航背景颜色是渐变颜色,使用一张图片)但是这张图片设置好以后,所有的控件Y坐标都会下移64,也就是说,这张图片会占用屏幕64pt 高度屏幕,而且无法被普通试图覆盖使用...上面设置为YES,下面的为NO 关于导航返回:     首先ios7 之后只要使用系统自带导航效果就有手动滑动返回效果。但是当自定义返回按钮,这种手动滑动返回效果就没有了。...每个视图控制器都有一个navigationItem属性,navigationItem中设置做按钮、右按钮、标题等,会随着控制器显示,也显示到navigationBar上 我们来看一下这些名词是什么意思

    2.1K20

    # iOS导航栏控制Tips

    许久写UI,对UI很多东西都生疏了,最近使用导航栏各种场景做一些总结。 1.导航栏显示与隐藏 导航栏显示与隐藏,分两种情况: 1.从不显示导航栏页面push到显示导航栏页面。...,直接使用系统pop方法。...比如: UINavigationController+HLPushAndPop.h UINavigationController+HLPushAndPop.m 然后,新增几个方法: 拿两个方法来举例 -...将新控制器数组设置为导航控制器栈数组,根据参数判断是否要显示动画。 这边做了一些发散,因为一些类可能会有很多子类,那么想要保证父类以及子类实例都只有一个,所以将方法做了改进。...,比如我们期望将要push出来控制器再某个栈中控制器后面或者前面,这样当点击返回或者侧滑,就直接回到了指定页面了。

    1.7K31

    去掉 iOS 导航栏返回按钮文本三种方案

    方案一 自定义 UINavigationController 遵守 UINavigationBarDel 协议 实现下面方法: #pragma mark --------- UINavigationBarDelegate...forState:UIControlStateNormal]; */ item.backBarButtonItem = back; return YES; } ❝注意:该方法会出现部分子控制器页面的返回按钮文字出现...可能造成导航标题居中问题 [[UIBarButtonItem appearance] setTitleTextAttributes:@{NSForegroundColorAttributeName...clearColor]} forState:UIControlStateHighlighted]; return YES; } 方案三(推荐) 给 UIViewController 添加类别(这里类别不需要导入可直接使用...) 然后在 load 方法里面用 Method Swzilling 方法替换交换 ViewDidAppear 方法,代码如下: #import "UIViewController+HideNavBackTitle.h

    2.4K20

    iOS导航栏切换界面隐藏和显示

    ,这个很烦,尝试了很多方法,试图在 UINavigationControllerDelegate 和 UITabBarControllerDelegate 代理中去做隐藏,并且分别是有动画和没动画,...但是因为 Tabbar所包含其实是 UINavigationController ,所以在点击 Tabbar 切换界面两个代理方法都会被调用,无解啊。...这个方法是直接隐藏了整个导航栏,所以如果要保存导航栏一些返回按钮以及其他自定义按钮,就需要自己在界面上去模拟添加,如果不想这么麻烦,也可以隐藏导航栏,而是将导航栏背景视图设为透明: [...结 上面的方法可以在只有导航栏控制器比较好操作,虽然不能做到像QQ那么好,但也能用,但如果有Tabbar存在,就会有问题。那如何做到QQ那样效果呢?...这里有一篇文章实现了:传送门:导航栏平滑显示和隐藏 - 个人页自我修养(1) ,不过作者使用swift实现,用到了extension,其实也就是OC下category,之后再研究一下OC下实现好了

    3.9K30

    UIViewController生命周期及iOS程序执行顺序

    当我们创建一个UIViewController类对象,通常系统会生成几个默认方法,这些方法大多与视图调用有关,但是在视图调用时,这些方法调用顺序如何,需要整理下。...上述方法流程图可以简单用如下表示: 运行APP —> 载入视图 —> 调用viewDidLoad方法 —> 调用viewWillAppear方法 —> 调用viewDidAppear方法 —> 正常运行...loadView 此方法控制器view为nil时候被调用。 此方法用于以编程方式创建view时候用到。...如果设备内存不足时候, view 控制器会收到didReceiveMemoryWarning消息。 默认实现是检查当前控制器view是否在使用。...如果它view不在当前正在使用view hierarchy里面,且你控制器实现了loadView方法,那么这个view将被release, loadView方法将被再次调用来创建一个新view。

    1.8K110

    UIViewController生命周期

    一、视图控制器 UIViewController采用懒加载方式,也就是说第一次访问到view属性才会加载创建它。...由于视图由视图控制器管理,所以讨论视图加载方式,主要讨论视图控制器加载方式。 通过Storyboard加载:这是苹果推荐方式。...合创建一些附加view和控件 3、ViewWillAppear 在视图加载完成,并即将显示在屏幕上,会调用viewWillAppear方法,在这个方法里,可以改变当前屏幕方向状态栏风格等。...方法执行完后,系统会执行viewDidAppear方法。...7、ViewWillDisAppear 视图即将消失 8、ViewDidDisAppear 视图已经消失 9、ViewWillUnload(已废弃) 当内存过低,需要释放一些不需要使用视图,即将释放时调用

    1.9K10

    iOS14开发-UIViewController

    当 UIViewController 访问 view 如果发现为 nil,就会调用 loadView 方法。 loadView 方法执行完会自动执行 viewDidLoad。...不要调用super.loadView()。 不要手动调用方法。...逆向传值 逆向传值即按照 UIViewController 跳转顺序反向进行传值,比如控制器A跳转到控制器B,控制器B在返回控制器A进行传值,这种方式就是逆向传值。...在需要传值地方调用代理属性方法完成传值。 代理对象(接收值 UIViewController) 实现被代理对象声明协议,实现协议中方法,拿到传过来值进行使用。...纯代码使用。 自定义使用。 其他 UITableViewController:表视图控制器,集成了 UITableView 视图控制器

    2.4K20

    iOS 多个category同时交换同一个方法

    控制台日志: RuntimeViewController2 viewDidAppear_ExchangeMethod2 此日志说明category方法会覆盖宿主类方法,而多个category...此日志说明load不会相互覆盖 3.3 viewWillAppear验证交换后方法同名结果 控制台日志: viewWillAppear_原生 此日志说明:多个category同时交换同一个方法...3与2交换,相当于是与1交换,即1指向了3 第二步交换完成 执行顺序:3->2->1 1.首先调用是类(1)中方法,相当于调用了3 2.3调了本身方法...,即调用了2方法 3.2再调了本身方法,即调了1方法 4.最后打印1中日志 理解了1,2,3顺序,对号入座即可。...顺序 由此验证了 3.4 打印结果。 总结: 为什么要研究这个问题呢?在使用MJRefresh与FDTemplateLayoutCell框架,发现同时交换了reloadData方法

    1.4K10

    iOS-控制器View创建和生命周期

    什么时候调用:每次访问UIViewControllerview,当view为nil,就会调用loadView方法。...viewDidLoad 作用:一般我们会在这里做界面上初始化操作,比如往view中添加一些子视图等。 什么时候调用:每当view创建完毕时候,最终都会调用viewDidLoad方法。...加载完毕 viewWillAppear控制器view将要显示 viewWillLayoutSubviews: 控制器view将要布局子控件 viewDidLayoutSubviews...: 控制器view布局子控件完成 viewDidAppear: 控制器view完全显示 viewWillDisappear: 控制器view即将消失时候...viewDidDisappear: 控制器view完全消失时候 view生命周期方法调用顺序 viewDidLoad -> viewWillAppear -> viewWillLayoutSubviews

    1.4K60

    App生命周期

    awakeFromNib 当awakeFromNib方法调用时,所有视图outlet和action已经连接,但还没有被确定,这个方法可以算作适合视图控制器实例化配合一起使用,因为有些需要根据用户喜好来进行设置内容...假设我们在处理内存警告释放view属性:self.view = nil。因此loadView方法在视图控制器生命周期内可能被调用多次。...viewWillAppear 系统在载入所有的数据后,将会在屏幕上显示视图,这时会先调用这个方法,通常我们会在这个方法对即将显示视图做进一步设置。...viewDidAppear 在view被添加到视图层级中以及多视图,上下级视图切换时调用这个方法,在这里可以对正在显示视图做进一步设置。...viewWillDisappear 在视图切换,当前视图在即将被移除、被覆盖是,会调用方法,此时还没有调用removeFromSuperview。

    1.3K10

    关于 循环引用问题

    官方文档 block是一个对象,在创建内存默认分配在栈上,不是堆上,所以它作用域仅限创建时候的当前上下文(函数, 方法...), 当我们在该作用域外调用该block, 程序就会崩溃....仅仅是个局部变量,存在栈中,会在block执行结束之后回收,不会再造成循环引用,并且会使页面返回上一级执行dealloc方法,直到block执行完,控制器执行dealloc方法,内存释放!...Analyze主要分析以下四种问题: 1、逻辑错误:访问空指针未初始化变量等; 2、内存管理错误:如内存泄漏等; 3、声明错误:从未使用变量; 4、Api调用错误:未包含使用库和框架。...就是在控制器POPdismiss之后去查看该控制器和其上view是否都被释放掉。...和viewDidDisAppear 和新方法交换,并在viewWillAppear方法绑定一个标志,NO则表示Push,YES则表示Pop,当标志为YES,则实现延迟方法

    3.3K20
    领券