通过方法或关闭,也许?
我创建了一个超类/父视图控制器的子类视图控制器,并在该子类视图控制器中放置了带占位符文本的标签。
我想将标签的值设置为超类/父视图控制器中的空字符串,或者特别是从导致子类视图控制器出现的IBAction函数。
这是代码,首先来自父类,然后是子类......
'''
class ViewController: UIViewController {
@IBAction func leavingView(){
self.EntryViewController.entryDateLabel.text = ""
self.EntryViewController.entryLabel.text = ""
self.dismiss(animated: true, completion: nil)
}
'''然后从子类......'''
class EntryViewController: ViewController {
@IBOutlet var entryDateLabel: UILabel!
@IBOutlet var entryLabel: UILabel!
}
'''
我已经提出了2个解决这个问题的方法,而没有父视图控制器知道它的子类。
在第一个例子中,父设置了孩子自己监听的属性(通过didSet
方法,然后相应地更新它的视图。但是,这不是理想的,因为entryDate
和entry
字符串字段本身是无用的,几乎是多余的在父母。
class ParentViewController: UIViewController {
var entryDate: String?
var entry: String?
@IBAction func leavingView(){
self.entryDate = ""
self.entry = ""
self.dismiss(animated: true, completion: nil)
}
}
class ChildViewController: ParentViewController {
@IBOutlet var entryDateLabel: UILabel!
@IBOutlet var entryLabel: UILabel!
override var entryDate: String? {
didSet {
guard isViewLoaded else {
return
}
entryDateLabel.text = entryDate
}
}
override var entry: String? {
didSet {
guard isViewLoaded else {
return
}
entryLabel.text = entry
}
}
}
在我看来,第二个解决方案更清晰,并使实现细节更加分离,因为您正在使用指令或事件来通知子视图控制器。
class ParentViewController: UIViewController {
@IBAction func leavingView(){
self.dismiss(animated: true, completion: didLeaveView)
}
func didLeaveView() { }
}
class ChildViewController: ParentViewController {
@IBOutlet var entryDateLabel: UILabel!
@IBOutlet var entryLabel: UILabel!
override func didLeaveView() {
entryDateLabel.text = ""
entryLabel.text = ""
}
}
由于您的要求不是那么清楚,我已经为您创建了一个演示,并且我已经将子ContainerViewController
添加到父级ViewController
中,并且从父视图控制器中,当您单击父级UILabel
的UIButton
时,您可以更改ViewController
文本,代码将是为ViewController
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
@IBAction func btnFromParentViewTapped(_ sender: Any) {
//Here get the child of your parent view controller
if let containerView = self.children[0] as? ContainerViewController {
containerView.lblContainer.text = ""
}
}
}
和ContainerViewController
代码将是:
class ContainerViewController: UIViewController {
@IBOutlet weak var lblContainer: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
这里不需要添加太多,因为您从父视图访问它。
你的结果将是:
正如你所看到的,当我点击标题Change Container label text
的按钮时,ContainerViewController
的标签文本设置为空字符串。
有关更多信息,请查看THIS演示项目。