如何从tabbarcontroller视图中删除子视图

时间:2018-01-04 22:41:30

标签: ios swift view

好的,所以目前我遇到了一个我想解决的小问题。好的,所以我在标签栏控制器中嵌入了两个视图控制器vc1和vc2。现在我在应用程序委托中将初始选定项目设置为0或vc1。然后我在选项卡栏控制器选项卡栏上添加一个小橙色点,并在vc1的viewDidLoad中添加函数addDot()。现在,我想要做的就是当用户点击vc2或标签栏控制器项1时,它会删除vc1中添加的橙色点。我在vc1中有一个名为remove dot的函数,我在vc2中调用,但没有任何反应。以下是我的一些代码:

 class vc1: UIViewController {

override func viewDidLoad() {
    super.viewDidLoad()
addDot()
}
let dot = UIView()
func addDot() {

    dot.frame = CGRect(x: self.view.frame.width - 97.5, y: self.view.frame.height - 9.5, width: 7, height: 7)
    dot.backgroundColor = UIColor(red: 0.949, green: 0.251, blue: 0, alpha: 1.0)
    dot.layer.cornerRadius = 3.5
    dot.clipsToBounds = true
    tabBarController?.view.addSubview(dot)
}
func removerDot () {

    dot.removeFromSuperview()
    dot.isHidden = true
     self.tabBarController?.tabBar.items?[1].title = "Discover"

}
}

和vc2(标签栏第1项)

  class vc2: UIViewController {

  override func viewDidLoad() {
    super.viewDidLoad()

   let vc1 = vc1()
   vc1.removeDot()
}

}

所以基本上我想做的就是在tabbarcontroller标签栏上添加一个点,如果它是1的选定项,则删除点。我试图弄清楚,但我不能,请你提出你的意见,这可能不是一个难以解决的问题。谢谢。

2 个答案:

答案 0 :(得分:0)

您可以在UITabBarController的子类中完成所有操作,如下所示:

class MyTabBarController: UITabBarController {
    let dot = UIView()

    override func viewDidLoad() {
        super.viewDidLoad()

        // Setup the initial attributes of the dot here.
        dot.frame = CGRect(x: 50, y: 50, width: 7, height: 7)
        dot.backgroundColor = UIColor(red: 0.949, green: 0.251, blue: 0, alpha: 1.0)
        dot.layer.cornerRadius = 3.5
        dot.clipsToBounds = true
        self.view.addSubview(dot)
    }

    override var selectedViewController: UIViewController? {
        get {
            return super.selectedViewController
        }
        set {
            super.selectedViewController = newValue
            // Determine which controller has been selected and adjust the dot accordingly.
        }
    }
}

当所选视图控制器发生变化时,您需要确定放置代码的位置,但是您将获得基础知识。

现在已经说过,这可能不是最好的整体方式,因为你不得不手动操作框架,等等。如果你能做到最好,你可以更好地为未选择和选择状态分别设置图像已经在其中的点,或者您可以尝试更改文本标签。

答案 1 :(得分:0)

正如Upholder在评论中所说,您的代码let vc1 = vc1()正在创建一个与您的标签栏控制器无关的全新vc1实例。这就像购买一辆新车,在新车的收音机上设置电台,然后想知道为什么现有汽车中的电台没有设置到新电台。

你需要一种在vc2中获得指向vc1的指针的方法。

假设您在Storyboard中设置了标签栏控制器及其子视图控制器,则会在每个子视图控制器加载时调用标签栏控制器的prepare(for:sender:)方法。您可以使用prepare(for:sender:)设置两个视图控制器之间的链接。

或者,您可以使用通知中心在用户点击橙色点时广播通知,并在其他视图控制器中侦听该通知。

顺便说一下,类名应该以大写字母开头,因此vc1应该是Vc1或更好VC1(因为VC代表ViewController)和{{1}应该是vc2