【发布时间】:2018-02-10 14:57:39
【问题描述】:
更新:
我已经使用按钮设计了自定义 tabBar。我有 3 个标签,
第一个标签有 消息 图标,第二个标签有 个人资料 图标,第三个标签有 照片 图标。对于第三个标签按钮,我使用了uiCollectionView(),我需要在其中设置图像。
对于第三个选项卡的 ViewController,在更改第一个选项卡按钮的 title 之前,我需要检查一个条件。如果messages JSON 数组不为空,则在第一个选项卡按钮上设置“新消息”标题,否则 消息 图标不会改变。
有一个 ParentTabViewController 有这 3 个选项卡,我使用了 uiView,我根据按下的选项卡按钮更改内容。我尝试使用委托访问 ParentTabViewController 中第三个选项卡的值,但委托始终为零。我确实喜欢这样:
class ParentTabViewController: UIViewController,MessageDelegateProtocol{
@IBOutlet weak var contentView: UIView!
@IBOutlet var tabBarButtons : [UIButton]!
@IBOutlet weak var firstTabButton: UIButton!
var MessageVC : UIViewController!
var ProfileVC : UIViewController!
var PhotosVC : UIViewController!
var viewControllers : [UIViewController]!
var message : String!
var selectedIndex:Int = 0
var photoVC = PhotosVC()
override func viewDidLoad() {
super.viewDidLoad()
photoVC.newMessageDelegate = self
let storyBoard = UIStoryboard(name:"Main", bundle:nil)
MessageVC = storyBoard.instantiateViewController(withIdentifier: "messagevc")
ProfileVC = storyBoard.instantiateViewController(withIdentifier: "profile")
PhotosVC = storyBoard.instantiateViewController(withIdentifier: "photos")
viewControllers = [MessageVC, ProfileVC, PhotosVC]
tabBarButtons[selectedIndex].isSelected = true
didPressTabs(tabBarButtons[selectedIndex])
}
@IBAction func didPressTabs(_ sender: UIButton)
{
let previousIndex = selectedIndex
selectedIndex = sender.tag
tabBarButtons[previousIndex].isSelected = false
let previousVC = viewControllers[previousIndex]
previousVC.willMove(toParentViewController: nil)
previousVC.removeFromParentViewController()
previousVC.view.removeFromSuperview()
sender.isSelected = true
let presentVC = viewControllers[selectedIndex]
addChildViewController(presentVC)
presentVC.view.frame = contentView.bounds
contentView.addSubview(presentVC.view)
presentVC.didMove(toParentViewController: self)
if selectedIndex == 2{ // this is what I thought of doing.Correct me if wrong.
// check the condition
// if messagesArray != nil
// set the first tab title "new message"
}
else{
// do not change the button image
}
}
func sendMessage(message : String)
{
self.message = message
print("message........", self.message, "\n\n")
}
}
这是第三个标签的视图控制器:
import UIKit
protocol MessageDelegateProtocol:class {
func sendMessage(message : String)
}
class PhotosVC: UIViewController,UICollectionViewDataSource, UICollectionViewDelegate{
@IBOutlet weak var collectionView: UICollectionView!
var userMessageArray = [UserMessageClass]() // array of model class
var newMessage : String!
weak var newMessageDelegate : MessageDelegateProtocol?
override func viewDidLoad() {
super.viewDidLoad()
collectionView.delegate = self
collectionView.dataSource = self
loadData() // function to get json reponse
}
// implement collectionView delegate and dataSource methods
func getData(newMsg : UserMessageClass) //func to get values from model class
{
newMessage = newMsg.messageString // here I get the "new message" String
newMessageDelegate?.sendMessage(message: newMessage)
} enter code here
func loadData()
{
// get json response. And pass the payload to UserMessageClass using that class's array
userMessageArray.append(UserMessageClass(dict : jsonData))
var msgData = UserMessageClass(dict: jsonData)
getData(alarm: msgData)
}
}
我尝试在另一个 VC 中搜索很多关于访问选项卡按钮的信息,但没有找到任何附近的方法。我也无法弄清楚为什么委托总是为零。建议或帮助将不胜感激。非常感谢:)
【问题讨论】:
标签: ios swift3 tabs uibutton delegates