好的,所以目前我遇到了一个我想解决的小问题。好的,所以我在标签栏控制器中嵌入了两个视图控制器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的选定项,则删除点。我试图弄清楚,但我不能,请你提出你的意见,这可能不是一个难以解决的问题。谢谢。
答案 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
。