【问题标题】:Is it possible to modify the properties of a subclass from a parent class in Swift 4?是否可以在 Swift 4 中从父类修改子类的属性?
【发布时间】:2019-07-17 04:08:19
【问题描述】:

也许是通过方法或闭包?

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

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

'''

【问题讨论】:

  • 如果您尝试子类化的类不是final,那么您应该可以。无论您覆盖什么,Xcode 都会将其标记为 override
  • 如果您在 leavingView() 方法中关闭视图控制器,那么为什么要更新标签?
  • 这实际上很有意义 Bilal...谢谢!

标签: swift properties subclass superclass


【解决方案1】:

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

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

}

【讨论】:

  • 嗨@GeovanniEscobar 如果它回答了你的问题,你介意接受这个答案。谢谢
【解决方案2】:

由于您的要求不是很清楚,我为您创建了一个演示,并在该演示中添加了子 ContainerViewController 到父 ViewController 并且从该父视图控制器中,您可以在单击时更改 UILabel 文本在父 ViewControllerUIButton 上,代码将用于 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演示项目。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-28
    • 2017-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多