Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/107.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 在目标VC中隐藏开关-Swift_Ios_Swift_Segue_Uiswitch - Fatal编程技术网

Ios 在目标VC中隐藏开关-Swift

Ios 在目标VC中隐藏开关-Swift,ios,swift,segue,uiswitch,Ios,Swift,Segue,Uiswitch,我有3个表视图控制器和一个目标视图控制器。 我想根据父表视图控制器的顺序隐藏/显示特定的开关。我尝试在每个表视图控制器中执行以下操作: override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { if (segue.identifier == "editTableVC1") { let cell: UITableViewCell = sender as! UITableVie

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

 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是从第二个表VC启动的,那个么将hidden属性设置为false,以此类推


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

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

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

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

isSyncSwitchHidden
并使用它来保存值:

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

entryVC.isSyncSwitchHidden=YES

然后,在NewEntryViewController中,ViewController将显示为执行以下操作:

self.syncSwitch.hidden = isSyncSwitchHidden
编辑:

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

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    let desitinationViewController = segue.destinationViewController as! NewViewController
    desitinationViewController.isSyncSwitchHidden = true
}


结果:

Optional(true)

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

在这种情况下,您尝试的方法根本不起作用。在prepareForSegue激发时,目标视图控制器视图尚未加载,因此其出口将为零

@请有正确的想法

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

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

##新代码:


在末尾标记,并显示新的prepareForSegue,以及属性的定义和更新的
视图将出现在
NewEntryViewController

We中,yeah开关是一个插座。我忘了提到如果有一个简单的属性(例如var a=“”),我想在prepareforsgue()中更改它。如何实现?在第二段中,它说创建一个属性来保存该值。我添加了一些代码来说明这一点。你是说当你使用一个单独的属性时?当你说它不工作时,实际结果是什么?是的,当我使用一个新的bool属性时。它并没有隐藏开关。如果在:self.syncSwitch.hidden=isSyncSwitchHidden之后放一个断点并打印出两个值,它们会显示什么?
Optional(true)