iOS开发:视图刷新后.isHidden属性及传值变更不生效问题
解决两个iOS视图更新不生效的问题
嘿,我来帮你搞定这两个让你头疼的视图更新问题!
问题1:修改.isHidden后调用setNeedsDisplay()无效
这个问题的核心是你搞混了「布局属性」和「绘制属性」对应的刷新逻辑:
.isHidden是布局相关属性,它控制视图是否参与布局和显示,和视图的自定义绘制内容(比如drawRect里的绘制逻辑)无关。setNeedsDisplay()的作用是触发视图的重绘流程,只对自定义绘制的内容生效,对布局类的变更完全没用。- 正确操作步骤:
- 修改
.isHidden后,调用view.setNeedsLayout()告诉系统需要重新计算布局;如果想让变更立即生效,用view.layoutIfNeeded()。 - 务必确保所有UI操作(包括修改
.isHidden)都在主线程执行,后台线程修改UI属性不会触发视图更新。
- 修改
问题2:AppDelegate中传递字符串后刷新视图无效
你这里踩了一个非常常见的坑:
你在AppDelegate里通过
storyboard.instantiateViewController创建的是全新的MovieDetailsViewController实例,根本不是当前屏幕上正在显示的那个VC!
所以你修改这个新实例的属性,自然不会反映到已显示的视图上。正确的做法是获取当前活跃的VC实例:
示例代码:获取当前显示的MovieDetailsViewController
// 在AppDelegate的消息处理方法里 guard let keyWindow = UIApplication.shared.keyWindow else { return } // 情况1:根控制器是UINavigationController,MovieDetailsVC是栈顶控制器 if let navController = keyWindow.rootViewController as? UINavigationController, let currentMovieVC = navController.topViewController as? MovieDetailsViewController { // 传递静态字符串并触发更新 currentMovieVC.yourTextProperty = "你的静态字符串" currentMovieVC.setNeedsLayout() } // 情况2:根控制器直接就是MovieDetailsViewController if let currentMovieVC = keyWindow.rootViewController as? MovieDetailsViewController { currentMovieVC.yourTextProperty = "你的静态字符串" currentMovieVC.setNeedsLayout() }
额外建议
在MovieDetailsViewController里封装一个专门的更新方法,把属性赋值和视图更新逻辑放在一起,代码更清晰也更不容易出错:
// 在MovieDetailsViewController里 func updateWithStaticString(_ string: String) { self.yourTextProperty = string // 如果有需要,还可以手动更新特定子视图的布局 self.titleLabel.sizeToFit() self.setNeedsLayout() }
然后在AppDelegate里直接调用这个方法就行:currentMovieVC.updateWithStaticString("你的静态字符串")
内容的提问来源于stack exchange,提问作者Smitesh Wadher
相关产品推荐
相关产品推荐

