隐藏目标VC-Swift中的开关

时间:2016-02-21 12:26:21

标签: ios swift segue uiswitch

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

 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

    }
}

如果从第二个表VC启动segue,则将hidden属性设置为false等等。

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

2 个答案:

答案 0 :(得分:0)

我猜这个syncSwitch是一个IBOutlet。如果是这种情况,则在创建视图时可能尚未实例化。

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

因此在NewEntryViewController中创建一个名为:

的属性
isSyncSwitchHidden

并使用它来保存值:

准备segue方法中的

代码将使用新属性:

entryVC.isSyncSwitchHidden = YES

然后在viewWillAppear中的NewEntryViewController中执行:

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)

答案 1 :(得分:0)

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

在这种特定情况下,您尝试过的操作无效。在prepareForSegue触发时,目标视图控制器视图尚未加载,因此它的出口将为零。

@pls有正确的想法。

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

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

##New code:

最后输入

标签,并在viewWillAppear中显示新的prepareForSegue,以及该属性的定义和更新的NewEntryViewController代码。