我一直在使用按鍵設計定製的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訪問選項卡按鈕,但沒有發現任何附近這樣的方法。此外,我無法弄清楚爲什麼代表總是零。建議或幫助將不勝感激。很多感謝:)
嗨,你可以告訴我怎麼做代表。由於ParentViewController首先被加載,並且'MessagesVC()'是第一個選項卡。當我點擊第三個標籤時,檢查'messages' json數組是否不爲零,將標題設置爲第一個標籤。我想檢查ParentVC中的條件,'如果selectedIndex == 2 {//執行檢查}',然後在這裏設置標題。但我無法設法從ParentVc中的MessageVC中獲取值。總是得到零。我嘗試委託,但失敗 –
你可以上傳你的項目在github上? – Rishab
嗨,我已經更新了這個問題。請檢查並建議有什麼問題 –