如何将视图添加到超类视图控制器?

时间:2016-01-07 18:07:38

标签: ios swift cocoa-touch

我有一个UIViewController Car,它是另一个UIViewController Vehicle的子类。

class Vehicle: UIViewController {

    override func viewDidLoad() {
        let vehicleLabel = UILabel()
        vehicleLabel.text = "This is the Vehicle"
        view.addSubview(vehicleLabel)
    }
}

class Car: Vehicle {
    override func viewDidLoad() {
        super.viewDidLoad()
        let carLabel = UILabel()
        carLabel.text = "This is the Car"
        super.view.addSubview(carLabel)
    }
}

// called like this

let carController = Car()
presentViewController(carController, animated: false, completion: nil)

Car我想在Vehicle顶级视图中添加UILabel。但是,我最后尝试将其添加到Car视图中。

我尝试过直接访问父视图:

super.view.addSubview(carLabel)

还尝试创建一个在Vehicle上添加视图的函数:

func addToSuperView(label: UILabel){
    self.view.addSubview(label)
}

还试过玩superclass但失败了。我最终得到了这个,标签位于与创建它们的UIViewController视图相关联的视图上。我喜欢Vehicle上的两个标签。

Exploded View

Tree

我该怎么做?

3 个答案:

答案 0 :(得分:1)

修改

分解视图不是您应该关注的内容,因为最常用的UIKit类具有许多私有使用的包装器视图和容器视图。

您可以确定的是,没有任何车辆或其视图的实例可以存在,因为您还没有为其编码。另请注意视图层次结构 - 只有一个标签,而不是两个。

答案 1 :(得分:1)

A" super.view"与您的父UIViewController视图不一致。

A" super.view"是视图层次结构中的东西。 父类或子类是类继承中的东西。

两者都完全不同!

备注:UpperCaseWriting =仅用于标记目的(强调关键参数)

答案 2 :(得分:1)

@Fook,For Car将UILabel添加到其superview,在这种情况下,Vehicle,Car必须是UIView的子类(不是UIViewController或Vehicle),必须作为子视图添加到Vehicle的视图中。然后Car可以在其超级视图中添加UILabel:

Car.superview?.addSubview(UILabel())

如果Car必须从UIViewController或Vehicle继承,那么Car必须由Vehicle提供。 Car是否继承车辆并不重要。然后,Car可以向视图控制器添加一个子视图,该视图控制器通过以下方式显示它:

presentingViewController?.view.addSubview(UILabel())