我有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等等。
有可能这样做吗?如果是这样,怎么样?
答案 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
代码。