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

时间:2019-02-23 02:33:36

标签: swift properties subclass superclass

也许通过方法或闭包?

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

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

答案 0 :(得分:0)

由于您的要求不太明确,因此我为您创建了一个演示,并在该演示中将子级ContainerViewController添加到父级ViewController中,您可以从该父级视图控制器中更改{{1 }}文字,当您点击父项UILabel的{​​{1}}时,代码将用于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 = ""
        }
    }
}

无需在此处添加太多内容,因为您是从父视图访问它的。

您的结果将是:

enter image description here

如您所见,当我单击标题为ContainerViewController的按钮时,class ContainerViewController: UIViewController { @IBOutlet weak var lblContainer: UILabel! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. } } 中的标签文本设置为空字符串。

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

答案 1 :(得分:0)

我想出了两种解决此问题的方法,而没有让父视图控制器知道其子类。

在第一个示例中,父级自行设置了子级侦听的属性(通过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 = ""
    }

}