是否可以从Swift 4中的父类修改子类的属性?

问题描述 投票:0回答:2

通过方法或关闭,也许?

我创建了一个超类/父视图控制器的子类视图控制器,并在该子类视图控制器中放置了带占位符文本的标签。

我想将标签的值设置为超类/父视图控制器中的空字符串,或者特别是从导致子类视图控制器出现的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!
     }

'''

swift properties subclass superclass
2个回答
0
投票

我已经提出了2个解决这个问题的方法,而没有父视图控制器知道它的子类。

在第一个例子中,父设置了孩子自己监听的属性(通过didSet方法,然后相应地更新它的视图。但是,这不是理想的,因为entryDateentry字符串字段本身是无用的,几乎是多余的在父母。

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 = ""
    }

}

0
投票

由于您的要求不是那么清楚,我已经为您创建了一个演示,并且我已经将子ContainerViewController添加到父级ViewController中,并且从父视图控制器中,当您单击父级UILabelUIButton时,您可以更改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.
    }
}

这里不需要添加太多,因为您从父视图访问它。

你的结果将是:

enter image description here

正如你所看到的,当我点击标题Change Container label text的按钮时,ContainerViewController的标签文本设置为空字符串。

有关更多信息,请查看THIS演示项目。

© www.soinside.com 2019 - 2024. All rights reserved.