【问题标题】:Hide switch in destination VC- Swift隐藏目标 VC-Swift 中的开关
【发布时间】:2016-02-21 12:26:20
【问题描述】:

我有 3 个表视图控制器和一个目标视图控制器。 我想根据父表视图控制器的 segue 隐藏/显示特定开关。我尝试在每个表视图控制器中执行以下操作:

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "editTableVC1") {
        let cell: UITableViewCell = sender as! UITableViewCell
        let indexPath: NSIndexPath = self.tableView.indexPathForCell(cell)!
        let navController: UINavigationController = segue.destinationViewController as! UINavigationController
        let entryVC: NewEntryViewController = navController.topViewController as! NewEntryViewController

        entryVC.syncSwitch.hidden = true

    }
}

如果 segue 是从 2nd Table VC 启动的,则设置 hidden 属性等于 false 等等。

可以这样做吗?如果有,怎么做?

【问题讨论】:

    标签: ios swift segue uiswitch


    【解决方案1】:

    我猜syncSwitch 是一个IBOutlet。如果是这种情况,那么它可能在您创建视图时没有被实例化。

    要克服这个问题,请在您的视图控制器上创建一个属性来保存布尔值,然后使用它来设置您的 syncSwitch IBOutlet。

    所以在 NewEntryViewController 中创建一个名为:

    isSyncSwitchHidden
    

    并用它来保存值:

    prepare for segue 方法中的代码将改用新属性:

    entryVC.isSyncSwitchHidden = YES

    然后在 NewEntryViewController 中的 viewWillAppear 中做:

    self.syncSwitch.hidden = isSyncSwitchHidden
    

    编辑:

    我编写和编译的示例代码:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        let desitinationViewController = segue.destinationViewController as! NewViewController
        desitinationViewController.isSyncSwitchHidden = true
    }
    

    import UIKit
    
    class NewViewController: BaseClassViewController {
    
        var isSyncSwitchHidden: Bool?
    
        override func viewWillAppear(animated: Bool) {
            print(isSyncSwitchHidden)
        }
    }  
    

    结果:

    Optional(true)
    

    【讨论】:

    • 我们,是的,Switch 是一个插座。我忘了提到如果有一个简单的属性(例如 var a = "")并且我想在 prepareForSegue() 中更改它。怎么办?
    • 在第二段中,它说创建一个属性来保存该值。我添加了更多代码来显示这一点。
    • 您的意思是当您使用单独的属性时?当你说它不起作用时,实际结果是什么?
    • 是的,当我使用新的 bool 属性时。它没有隐藏开关。
    • 如果在 self.syncSwitch.hidden = isSyncSwitchHidden 之后放置一个断点并打印出这两个值,它们显示的是什么?
    【解决方案2】:

    作为一般规则,您不应该尝试操纵另一个视图控制器的视图。这违反了封装原则,这是OOD(面向对象设计)的重要原则。

    在这种特定情况下,您尝试的方法根本行不通。在 prepareForSegue 触发时,目标视图控制器视图尚未加载,因此它的 outlet 将为 nil。

    @pls 有正确的想法。

    在您的目标视图控制器中创建一个公共属性hideSwitch。在您的 prepareForSegue 中将 hideSwitch 设置为 true。然后在您的NewEntryViewController 的viewWillAppear 中,检查hideSwitch 的值。如果是真的,请隐藏您的开关。

    这种方法绝对有效。我已经用了几十次了。如果您对这种方法的尝试不起作用,那么您的代码就有问题。编辑你的问题,添加一个

    ##New code:

    在末尾添加标签,并在您的NewEntryViewController 中显示您的新prepareForSegue、属性定义和更新的viewWillAppear 代码。

    【讨论】:

      猜你喜欢
      • 2012-06-27
      • 2019-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多