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

在dismissViewController回调中刷新presentingViewController的UI时意外发现nil

,这通常是因为在dismissViewController之后,presentingViewController已经被释放或者不存在了。这种情况下,我们需要先检查presentingViewController是否为nil,然后再进行UI的刷新操作。

在iOS开发中,dismissViewController用于关闭当前的视图控制器,并返回到上一个视图控制器。当我们调用dismissViewController方法时,系统会自动触发一个回调方法,即dismissViewControllerAnimated:completion:方法中的completion block。在这个回调方法中,我们可以执行一些操作,比如刷新UI。

但是需要注意的是,当我们调用dismissViewController方法关闭当前视图控制器时,presentingViewController可能已经被释放或者不存在了。这可能是因为我们在presentingViewController中使用了弱引用,或者在dismissViewController之前对presentingViewController进行了其他操作导致其被释放。

为了解决这个问题,我们可以在dismissViewController回调方法中进行一些判断和保护措施。首先,我们可以使用可选绑定来检查presentingViewController是否为nil,如果为nil,则不执行刷新UI的操作。其次,我们可以在presentingViewController中添加一个标志位,用于表示是否需要刷新UI。在dismissViewController回调方法中,我们可以先检查这个标志位,如果需要刷新UI,则执行相应的操作。

另外,如果我们在dismissViewController回调方法中需要进行复杂的UI刷新操作,可以考虑使用GCD或者操作队列来异步执行,以避免阻塞主线程。

总结起来,当在dismissViewController回调中刷新presentingViewController的UI时意外发现nil,我们可以按照以下步骤进行处理:

  1. 在dismissViewController回调方法中,使用可选绑定检查presentingViewController是否为nil。
  2. 如果presentingViewController不为nil,则执行UI刷新操作。
  3. 如果presentingViewController为nil,则不执行UI刷新操作。
  4. 可以在presentingViewController中添加一个标志位,用于表示是否需要刷新UI。
  5. 在dismissViewController回调方法中,先检查这个标志位,如果需要刷新UI,则执行相应的操作。
  6. 如果需要进行复杂的UI刷新操作,可以考虑使用GCD或者操作队列来异步执行。

腾讯云相关产品和产品介绍链接地址:

  • 腾讯云:https://cloud.tencent.com/
  • 云服务器(CVM):https://cloud.tencent.com/product/cvm
  • 云数据库 MySQL 版:https://cloud.tencent.com/product/cdb_mysql
  • 云原生应用引擎(TKE):https://cloud.tencent.com/product/tke
  • 人工智能(AI):https://cloud.tencent.com/product/ai
  • 物联网(IoT):https://cloud.tencent.com/product/iotexplorer
  • 移动开发(移动推送):https://cloud.tencent.com/product/umeng_push
  • 云存储(COS):https://cloud.tencent.com/product/cos
  • 区块链(BCS):https://cloud.tencent.com/product/bcs
  • 元宇宙(Tencent XR):https://cloud.tencent.com/product/xr
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

跟iOS UI捉迷藏,真的能够获取到self.presentingViewController

近期,在做一个有趣实验,研究presentViewController和dismissViewController对应关系,这里发现了一个有趣现象,通常情况下,两者配对使用,如果连续两次presentViewController...第二点:如果你present了一系列控制器,那么系统会把被present出来控制器放在一个栈,当处在底层控制器执行dismiss时候,它之后被present出来控制器都会被移除,只有栈顶上控制器会有...比如你当前控制器A导航nav,A present B之后,实际上B.presentingViewController指向是nav而不是A。...加入了通知等响应性内容,很难保证不出现这样情况,而一旦第二个无法加载成功,则会开发同学产生很深困扰,也会把难以预期UIBug暴漏给用户 事实上,设置了上文两个属性后,再连续加载,你会发现连续两次...[tempVC2 dismissViewControllerAnimated:NO completion:nil]; 和在FirstViewController [self dismissViewControllerAnimated

59620

打造开源第一 iOS 图片浏览器 (支持视频)闲谈

五、异步任务重复请求 对于图片浏览器每一个图像,都有一个数据模型 data,当异步操作调过后,虽然可以通过对比 cell.data 和 block 持有的 data 来判断是否需要进行 UI 刷新,...当然,并不是所有异步任务都是可以中断,发起异步操作消耗了一定资源,笔者认为不应该放弃掉,而是将结果存储异步 Block 持有的 data ,至于 UI 刷新与否按照之前说方法判断。...这种情况经常出现,如果脱离业务来思考,对于一个同一个异步请求多次调用,应该使用一个数组来将所有发起请求 Block 存储起来,并且若正在异步请求要及时返回,当异步请求完成,遍历数组 Block...这时候异步请求中就要用一个指针存储这个 cell 发起异步请求 Block,异步请求成功时候调用这个 Block,这带来了潜在循环引用问题,并且代码观感非常差。...然后图片浏览器 dismiss 时候,presentingViewController 方向并不会恢复。

1.5K40

iOS 转场动画探究(二)

可以通过需要产生动画效果视图控制器transitionCoordinator属性来获取转场协调器,转场协调器只转场动画执行过程存在。...2、转场协调器和动画控制器对象一块工作,确保任何额外动画被执行在同样动画组,就像转场动画一样。一样组拥有动画,意味着它们同样时间执行,并且可以响应一个动画控制器对象提出任何时间改变。...3、使用转场协调器处理视图层次动画比viewWillappear:方法做出同样改变,或者相同方法在你视图控制器要好很多。你用这个协议方法所注册block会确保执行一样转场动画。...清理非常重要,当用户取消转场交互,当取消时候,你需要返回一个原始视图层次状态,就像之前转场存在一样。 我们协议最上面会看到这样一句话: ?        ...当presentation/dismissal一个视图控制器,UIKit会自动创建一个转场协调器对象,并且给视图控制器transitionCoordinator属性赋值(这一点接下来实例,你会看

1.3K70

iOS 转场动画探究(二)

可以通过需要产生动画效果视图控制器transitionCoordinator属性来获取转场协调器,转场协调器只转场动画执行过程存在。...2、转场协调器和动画控制器对象一块工作,确保任何额外动画被执行在同样动画组,就像转场动画一样。一样组拥有动画,意味着它们同样时间执行,并且可以响应一个动画控制器对象提出任何时间改变。...3、使用转场协调器处理视图层次动画比viewWillappear:方法做出同样改变,或者相同方法在你视图控制器要好很多。你用这个协议方法所注册block会确保执行一样转场动画。...清理非常重要,当用户取消转场交互,当取消时候,你需要返回一个原始视图层次状态,就像之前转场存在一样。 我们协议最上面会看到这样一句话: ?        ...当presentation/dismissal一个视图控制器,UIKit会自动创建一个转场协调器对象,并且给视图控制器transitionCoordinator属性赋值(这一点接下来实例,你会看

83340

iOS对UIViewController生命周期和属性方法解析

iOSUIViewController是UIKit框架中最基本一个类。从第一个UI视图到复杂完整项目,都离不开UIViewController作为基础。...storyBoard拉一个label,然后关联到头文件,如下打印,会发现我们得到controller,里面的视图对象并没有进行创建: ViewController2 * viewController2...有人提出可以创建后,手动以下loadView方法,我们试一下,结果如下: ?...UIStoryboardSegue,方法名我们可以自己定义,之后StoryBoardViewController1Exit选项,我们会发现多了一个这样方法: ?...当然,使用unwind segue方法,也是会有一些帮助我们进行跳转前设置和传值,UIViewController如下方法会在跳转前调用,返回NO,则不能进行跳转: -(BOOL)canPerformUnwindSegueAction

2.9K20

WKWebView 白屏问题

1、WKWebView 自诩拥有更快加载速度,更低内存占用,但实际上 WKWebView 是一个多进程组件,Network Loading 以及 UI Rendering 在其它进程执行。...会变为 nil, 简单 reload 刷新操作已经失效,对于一些长驻H5页面影响比较大。...,我们该函数里执行[webView reload](这个时候 webView.URL 取值尚不为 nil)解决白屏问题。...一些高内存消耗页面可能会频繁刷新当前页面,H5侧也要做相应适配操作。...B、检测 webView.title 是否为空 并不是所有H5页面白屏时候都会调用上面的函数,比如,最近遇到一个高内存消耗H5页面上 present 系统相机,拍照完毕后返回原来页面的时候出现白屏现象

4.4K20

2021年,大厂常问iOS面试题--Runloop篇

这个 Observer order 是 2147483647,优先级最低,保证其释放池子发生在其他所有之后。 主线程执行代码,通常是写在诸如事件、Timer。...这些会被 RunLoop 创建好 AutoreleasePool 环绕着,所以不会出现内存泄漏,开发者也不必显示创建 Pool 了。 5.GCD Runloop使用?...通常事件比如 UIButton 点击、touchesBegin/Move/End/Cancel 事件都是在这个完成。 10.手势识别的过程?...当有 UIGestureRecognizer 变化(创建/销毁/状态改变),这个都会进行相应处理。...UI相关动画或者显示内容使用 CADisplayLink比起用NSTimer好处就是我们不需要在格外关心屏幕刷新频率了,因为它本身就是跟屏幕刷新同步

1.7K10

Xcode:处理故事板更好方式 享受Interface Builder提示和技巧

图片来源:Apple AppleXcode 8对Interface Builder进行了很大改进。...代码初始化基于storyboardviewController,我经常会看到以下代码: let storyboard = UIStoryboard(name: “Main”, bundle: nil...这是另一个常见错误:使用新segue导航以前viewController。...在这种情况下,从按钮拖动到“退出”出口是期望代码已经项目中。 通常,当您为按钮创建动作插座,它会将代码放在拥有该按钮同一个类。...代码执行它更简单:不是为按钮创建“展开”动作,而是创建常规IBAction并使用dismissViewController或popViewController(取决于您导航结构): @IBAction

1.4K30

Mac UT实践小结

4、设计case难点:解决单线程,没有调和通知:加定时器 manager初始化设置定时刷新(1s 60次),每次刷新后触发回: ? 控制类触发更新: ?...需要针对刷新弹幕进行校验,但是由于初始化是单线程,定时器刷新结果在原代码里没有调和通知,初始后就像脱缰野马,线程内之前获得只能得到初始化时候弹幕状态。...六、发现问题 【问题1】 speed为负数,X坐标范围出现报错:  XCTAssertTrue(danmuViewFrame.origin.x < CanvasViewWidth);——Fail 调试后发现...它们区别是, setObject: forkey: object 是不能够为 nil ,不然会报错。setValue:value可以为nil。...七、可测性提升 通过本次单元测试尝试,发现不是所有的代码都可以做单元测试,本次单测覆盖率瓶颈之一——UI操作无法覆盖,这种是不适合做UT

97540

iOS复习中有关SDWebImage可能知识点总结(1)

先从内存图片缓存查找是否有图片,如果内存已经有图片缓存,SDImageCacheDelegateimageCache:didFineImage:forKey:userInfo:到SDWebImageManager...根据URLKey硬盘缓存目录下尝试读取图片文件.这一步是NSOperation进行操作,所以主线程进行结果notifyDelegate. 7....如果上一操作从硬盘读取到了图片,将图片添加到内存缓存(如果空闲内存过小 会先清空内存缓存).SDImageCacheDelegate imageCache:didFinishImage:forKey...图片解码处理一个NSOperationQueue完成,不会拖慢主线程UI.如果有需要对下载图片进行二次处理,最好也在这里完成,效率会好很多. 14....工作主线程,虽然NSURLConnection工作子线程,但因为UI相关操作和setImage都在同一个主线程,滑动屏幕会导致主线程runloop切换mode为UITrackingRunLoopMode

84320

深入学习iOS定时器

定时器,用来延迟或重复执行某些方法,例如:网络定时刷新UI间隔刷新,动画效果......iOS定时器大致分为这几类: NSObject GCD定时器 NSTimer CADisplayLink...,其包含一个时间长度和一个(函数指针)。...当其加入到 RunLoop ,RunLoop会注册对应时间点,当时间点到时,RunLoop会被唤醒以执行那个。后面要讲NSTimer 其实就是 CFRunLoopTimerRef。...实际上 RunLoop 底层也会用到 GCD 东西,CFRrunLoop.c我们能发现引用了#include ...如果某个时间点被错过了,例如执行了一个很长任务,则那个时间点也会跳过去,不会延后执行。就比如等公交,如果 10:10 我忙着玩手机错过了那个点公交,那我只能等 10:20 这一趟了。

91620

NSNotificationCenter 通知使用方法详解你要知道KVC、KVO、Delegate、Notification都在这里

KVO机制类似,KVO触发函数也可以被对个对象响应,但代理模式delegate则是一种一对一模式,委托对象只能有一个,对象也只能和委托对象通过代理方式通信。...:YES completion:nil]; } 代码比较简单不再给出相关运行截图了,不难发现NSNotificationCenter使用步骤如下: 1、需要监听某通知地方注册通知监听器 [[NSNotificationCenter...上面的栗子很简单,但有一点是需要强调,我们NextViewController中发送通知是main线程中发送,因此ViewController监听器函数也会在main线程执行,因此我们监听器函数修改...UI不会产生任何问题,但当通知是在其他线程中发送,监听器函数很有可能就是发送通知那个线程执行,我们知道UI更新必须在主线程执行,这个时候就需要注意,如果通知监听器函数有需要更新UI代码...[@"inputText"]; } 很多时候我们使用是第三方框架发送通知,或是系统提供通知,我们无法预知这些通知是否是主线程中发送,为了安全起见最好在需要更新UI使用GCD将更新逻辑放入主线程执行

2.2K60

RunLoop

之后会介绍一下 iOS ,苹果是如何利用 RunLoop 实现自动释放池、延迟、触摸事件、屏幕刷新等功能。...这个 Observer order 是 2147483647,优先级最低,保证其释放池子发生在其他所有之后。 主线程执行代码,通常是写在诸如事件、Timer。...通常事件比如 UIButton 点击、touchesBegin/Move/End/Cancel 事件都是在这个完成。...如果在两次屏幕刷新之间执行了一个长任务,那其中就会有一帧被跳过去(和 NSTimer 相似),造成界面卡顿感觉。快速滑动TableView,即使一帧的卡顿也会让用户有所察觉。...和 kCFRunLoopExit 事件,收到,遍历所有之前放入队列待处理任务,然后一一执行。

81820

从AFNetworking源码分析到应用全解 原

,之前代码是内部代理处理类,就像在MVVM模式,我们总是喜欢将控制器逻辑放入View-Model中一样,AFURLSesstionManager实例也会将通知,等操作交给这个代理实例处理。...代理其实依然是AFURLSesstionManager类自身,这里Manager作为中介来进行方法传递(它也会自己处理一些,与开发者相关才会转给内部代理处理)。    ...下面的流程就是系统NSURLSesstionTaskDelagate相关调了: //接收到URL重定向 - (void)URLSession:(NSURLSession *)session...,头文件接口更多提供了上述设置还有些通知发送。...使用AFNetworking进行网络请求,如果你有过抓包,你一定会发现发送普通HTTP请求HEAD默认包含了许多信息,其实这些都是AFHTTPRequestSerizlizaer类做,他默认会向请求头中添加

3K51

闭包是个好东西,巧用闭包实现数据绑定

以往我们再处理异步数据时候,往往都会通过 Delegate 或者 Notification 等方式,待收到异步数据后再去刷新 UI。...这样处理数据并没有毛病,但是如果遇到 UI 上有大量控件需要不定时更新数据,那通过 Delegate 和 Notification 方式就会显得不够优雅,所以我们才会讲到数据绑定这个知识。...Box 上调用 bind(listener:) ,它会变成 Listener 并立即收到 Box 的当前值通知; 案例实践 本次演示,我拿了之前一个项目代码做参考,此项目也是我之前写一篇文章...原先在这个项目中,我通过 Delegate 方式去实现数据刷新,代码如下: 定义 PreloadCellViewModelDelegate 协议,用于 protocol PreloadCellViewModelDelegate...,数据然后进行 UI 刷新 func fetchImages() { guard !

46310

iOS小技能:授权检测(引导权限开启,监听权限变化执行事件。)

前言 需求: 新增开启相册权限引导:iPhone"设置-隐私-照片"中允许访问照片 监听到用户点击不允许: 用户未作出明确选择情况下自己主动请求了一次权限设置 新增开启相机权限引导:iPhone...//已废弃,相当于一直允许获取定位 kCLAuthorizationStatusDenied //拒绝获取定位 引导权限开启,监听权限变化执行事件.../** showAlert: 是否弹窗引导 block: */ +(BOOL)isHasLocationAuthorityWithisShowAlert:(BOOL)showAlert block...执行允许之后定位操作 block(nil); } return YES; } 监听权限变化执行事件 - (CLLocationManager *)locationMan...cancelString:@"取消" cancleBlock:nil sureString:@"去设置" sureBlock:^{ // 需要在info.plist添加

3K40
领券