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

跟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

73920

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

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

1.6K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    iOS 转场动画探究(二)

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

    86540

    iOS 转场动画探究(二)

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

    1.4K70

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

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

    3K20

    WKWebView 白屏问题

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

    4.5K20

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

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

    1.9K10

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

    图片来源:Apple Apple在Xcode 8中对Interface Builder进行了很大的改进。...在代码中初始化基于storyboard的viewController时,我经常会看到以下代码: 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的。

    1K40

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

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

    91920

    RunLoop

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

    84320

    深入学习iOS定时器

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

    98120

    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.3K60

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

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

    3.2K51

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

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

    49710

    Swift-MVVM 简单演练(三)

    ---- 处理登录相关通知 Token为nil时测试 所有的网络请求都是基于token的,如果没有token的话(虽然实际程序中几乎不可能出现token = nil的情况),我们应该使程序在当token...由于又进行了网络请求,而且我们判断了当token为nil时的判断,因此会发送一个登录的通知。...因为,我们需要拿到这个在首页就展示昵称或者头像。所以在登录成功但是没有执行完成回调的时候去执行该方法获取用户个人信息是比较理想的位置。...,所以开发时,不能在这个方法里面处理UI,而且如果是xib开发的话,你打印视图的话,结果都是nil的。...HQNewFeatureView() : HQWelcomeView() 在HQNewFeatureView中,进行布局,我写UI布局套路都比较单一,懒加载控件,在extension中setupUI,如果有按钮的监听方法

    2.6K30
    领券