Swift 4跨文件变量修改与使用:视图控制器间属性控制问题
嘿,这个需求其实很容易实现,我给你分享两种常用的靠谱方案,你可以根据自己的场景选择:
方案一:通过
prepare(for:sender:)传递状态(推荐) 这种方法最灵活,能精准控制只有从ViewControllerA跳转过来时才显示目标View,步骤如下:
给Segue设置标识符
打开Storyboard,选中ViewControllerA到ViewControllerB的segue,在右侧属性面板里设置Identifier为类似"PresentViewControllerB"的名字(名字自定义,只要你能对应上就行)。在ViewControllerB中添加状态属性
给ViewControllerB加一个布尔属性,用来标记是否要显示目标View:class ViewControllerB: UIViewController { // 假设你的目标View叫targetView,记得在Storyboard里关联IBOutlet @IBOutlet weak var targetView: UIView! // 默认是false,保持初始隐藏状态 var shouldShowTargetView = false override func viewDidLoad() { super.viewDidLoad() // 根据属性设置View的显示状态 targetView.isHidden = !shouldShowTargetView } }在ViewControllerA中实现跳转前的准备逻辑
重写prepare(for:sender:)方法,在跳转前给ViewControllerB的属性赋值:class ViewControllerA: UIViewController { override func prepare(for segue: UIStoryboardSegue, sender: Any?) { // 匹配我们设置的segue标识符 if segue.identifier == "PresentViewControllerB" { // 强转目标控制器为ViewControllerB guard let vcB = segue.destination as? ViewControllerB else { return } // 设置状态为true,告诉B要显示目标View vcB.shouldShowTargetView = true } } }
方案二:直接在ViewControllerB的生命周期方法中处理(简单但不够灵活)
如果你的ViewControllerB只会从ViewControllerA跳转过来,不需要考虑其他跳转场景,可以直接在B的viewWillAppear(_:)里修改状态:
class ViewControllerB: UIViewController { @IBOutlet weak var targetView: UIView! override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) // 每次出现时显示目标View targetView.isHidden = false } }
不过这种方法的缺点是,不管从哪里跳转到B,这个View都会显示,如果你之后有其他跳转需求就不太方便了,所以还是方案一更推荐。
注意事项
- 一定要确保ViewControllerB中的
targetView已经正确关联了Storyboard里的View(IBOutlet不能是nil),不然设置isHidden会崩溃。 - 方案一中的segue标识符必须和Storyboard里设置的完全一致,大小写也要匹配哦。
内容的提问来源于stack exchange,提问作者badman
相关产品推荐
相关产品推荐

