【问题标题】:In inheritance can we by pass viewDidLoad在继承中我们可以通过 viewDidLoad
【发布时间】:2017-04-20 09:19:00
【问题描述】:

我有一个 UIViewController_A。 我这个视图控制器的 vidDidLoad 我有一个 http 请求来获取一些数据。

我继承了 UIViewController_A 并创建了 UIViewController_B。 现在我可以绕过 [super viewdDidLoad];在 UIViewController_B 中。

因为如果我调用 [super viewdDidLoad];在 xxx_B 然后它正在从 xxx_A 进行 http 调用,我不想要这个。

【问题讨论】:

  • 真正的问题是什么?
  • 请检查我的回答。
  • @George:在子类中调用 super.viewDidLoad() 真的有必要吗?

标签: ios iphone inheritance viewdidload


【解决方案1】:

viewDidLoad() 方法应始终调用super.viewDidLoad()。不这样做可能会导致控制器无法正确实例化。

相反,您可以覆盖父控制器的所需行为。例如:

class ParentController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        performOperation()
    }

    func performOperation() {
        print("Calling WebService from ParentController")
    }
}

class ChildController: ParentController {
    override func viewDidLoad() {
        super.viewDidLoad() // <--- ALWAYS REQUIRED
        // Custom initialization
    }

    override func performOperation() {
        print("Overriding parent operation so it doesn't call the WebService")
    }
}

【讨论】:

  • 用户不想运行你正在做的用户不想做的功能
  • 不,根本没有调用父函数。
  • 我要问的是,如果我不调用父 viewDidLoad 那么正确吗?
  • 在覆盖它时,您应该始终调用super.viewDidLoad。你不能跳过那部分。您可以做的是覆盖 webservice 方法调用,这样它就不会在子控制器中进行实际调用。
  • @redent84 我的印象是UIViewController.viewDidLoad() 什么都不做,它只是一个方便初始化子视图的地方。因此,如果您的自定义视图控制器是UIViewController 的直接子类,则调用super 无效。当前的文档没有提到任何一种方式。当然,一般情况下有中间子类,跳过它是有风险的。
猜你喜欢
  • 2014-01-09
  • 1970-01-01
  • 2020-01-25
  • 1970-01-01
  • 2015-06-21
  • 1970-01-01
  • 1970-01-01
  • 2016-08-27
  • 1970-01-01
相关资源
最近更新 更多