好的,所以目前我遇到了一个我想解决的小问题。好的,所以我在标签栏控制器中嵌入了两个视图控制器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的选定项,则删除点。我试图弄清楚,但我不能,请你提出你的意见,这可能不是一个难以解决的问题。谢谢。
您可以在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.
}
}
}
当所选视图控制器发生变化时,您需要确定放置代码的位置,但是您将获得基础知识。
现在已经说过,这可能不是最好的整体方式,因为你不得不手动使用框架,等等。如果你能做到最好,你可以更好地为已经选中状态的未选择状态和选定状态设置单独的图像在其中或您可以尝试更改文本标签。
正如Upholder在评论中所说,你的代码let vc1 = vc1()
正在创建一个与标签栏控制器无关的全新vc1
实例。这就像买一辆新车,在新车的收音机上设置电台,然后想知道为什么现有汽车的电台没有设置到新电台。
你需要一种在vc2中获得指向vc1的指针的方法。
假设您在Storyboard中设置了标签栏控制器及其子视图控制器,则会在每个子视图控制器加载时调用标签栏控制器的prepare(for:sender:)
方法。您可以使用prepare(for:sender:)
在两个视图控制器之间设置链接。
或者,您可以使用通知中心在用户点击橙色点时广播通知,并在其他视图控制器中侦听该通知。
顺便说一句,类名应该以大写字母开头,所以vc1
应该是Vc1
或更好的VC1
(因为VC代表ViewController)而vc2
应该是VC2
。