使 UISwitch 在打开/关闭时隐藏/取消隐藏标签

Posted

技术标签:

【中文标题】使 UISwitch 在打开/关闭时隐藏/取消隐藏标签【英文标题】:Make a UISwitch hide/unhide a label when it toggles on/off 【发布时间】:2017-09-07 23:09:08 【问题描述】:

MeditationSettingsViewController 有一个 UISwitch 通过 Segue 链接到 MeditationScreenViewControllerUISwitch 不会从MeditationScreenViewController 隐藏名为phaselabel 的标签中的文本,而是显示MeditationSettingsViewController 屏幕。如何获取它以便开关不执行此操作,而是在开关打开/关闭时隐藏和取消隐藏phaselabel

class MeditationSettingsViewController: UIViewController 

@IBAction func showCycleTitleChanged(_ sender: UISwitch) 
    if (sender.isOn == true)
    
        func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
            if segue.identifier == "segue" 
                if let sendToDetailViewController = segue.destination as? MeditationScreenViewController 
                    sendToDetailViewController.isSwitchOn = sender!.isOn
                

            

class MeditationScreenViewController: UIViewController 

override func viewWillAppear(_ animated: Bool) 
    if isSwitchOn == true 
      //unhide the label
      self.phaseLabel.isHidden = true
        //set your label value here
    
    else 
        self.phaseLabel.isHidden = false
    

【问题讨论】:

为了清楚起见,您希望开关打开/关闭以隐藏/取消隐藏另一个视图控制器中的阶段标签,对吧? MeditationScreenViewController 如何显示在屏幕上? 是的,没错。它通过单击弹出窗口上的取消来显示。弹出窗口连接到 MeditationSettingsViewController。 您需要在MeditationSettingsViewController 中获得对phaselabel 的(弱)引用,以便您可以隐藏/取消隐藏它。另一种方法是让MeditationScreenViewController 以某种方式监听(通过使用 NSNotificationCenter 或委托)切换开关,然后在那里隐藏/取消隐藏标签。在不知道您的项目结构的情况下,我很难为此提供代码。 好的,苹果在界面上做,切换开/关按钮来激活不同视图控制器中的东西。请让我知道您需要从项目中获得哪些额外代码? 我已经更新了使用 NSNotificationCenter 的答案。希望这应该有效。 【参考方案1】:

尝试使用NSNotificationCenter 让两个视图控制器知道开关状态的变化。

MeditationSettingsViewControllershowCycleTitleChanged 函数中,执行以下操作:

@IBAction func showCycleTitleChanged(_ sender: UISwitch) 
    let data:[String: Bool] = ["state": sender!.isOn]
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "switchChanged"), object: nil, userInfo: data)

MeditationScreenViewController,像这样收听通知:

viewDidLoad:

 NotificationCenter.default.addObserver(self, selector: #selector(self.showHideLabel(_:)), name: NSNotification.Name(rawValue: "switchChanged"), object: nil)

另外添加这个函数来处理通知:

func showHideLabel(_ notification: NSNotification) 
    self.phaselabel.isHidden = notification.userInfo?["state"] as? Bool

【讨论】:

它说 'MeditationSettingsViewController' 没有成员 phaselabel 所以不起作用。 是的 showCycleTitleChanged 连接到 UISwitch 的 valueChanged。 ibaction内部调用函数正常吗?? @user8270584 是的。 @aksh1t 我的意思是在里面定义一个函数??

以上是关于使 UISwitch 在打开/关闭时隐藏/取消隐藏标签的主要内容,如果未能解决你的问题,请参考以下文章

当用户向上滚动时,如何使我的 tableHeaderView 捕捉并取消捕捉到隐藏/未隐藏位置

使自动隐藏的任务栏在窗口最大化而不取消隐藏

WIN取消100M隐藏分区异常断电后绕过修复模式

在扩展坞保持活动状态时隐藏 NSMenu

从弹出窗口中的 UISwitch 操作中隐藏 UIImageView (iPad)

在取消隐藏导航窗格时生成事件