2017-09-01 56 views
0

更新:斯威夫特3 - 代表始終返回零值

我一直在使用按鍵設計定製的TabBar。我有3個標籤, 第一個標籤有消息圖標,第二個有配置文件圖標和第三有照片圖標。對於第三個標籤按鈕,我使用uiCollectionView(),我需要設置圖像。

對於第三個選項卡的ViewController,在更改第一個選項卡按鈕的title之前,有一個條件需要檢查。如果messagesJSON數組不爲空,則在第一個選項卡按鈕上設置「新消息」標題,否則消息圖標不會更改。

有一個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訪問選項卡按鈕,但沒有發現任何附近這樣的方法。此外,我無法弄清楚爲什麼代表總是零。建議或幫助將不勝感激。很多感謝:)

回答

1

問題是以下行。

let firstTab = storyBoard.instantiateViewController(withIdentifier: "parentVC") as! ParentViewController 

您可能期待它爲您提供最初設置的ParentViewController的實例。但是,它會給你一個新啓動的ParentViewController的實例,這不是你想要的。

爲了解決這個問題,您可以使用定義的委託或完成塊,它將在您的ParentViewController類中定義。

更新: 嘗試增加PhotosVC.newMessageDelegate = self線下

PhotosVC = storyBoard.instantiateViewController(withIdentifier: "photos") 

也改變var PhotosVC : UIViewController!var photosVC: PhotosVC!

這應該現在的工作。

+0

嗨,你可以告訴我怎麼做代表。由於ParentViewController首先被加載,並且'MessagesVC()'是第一個選項卡。當我點擊第三個標籤時,檢查'messages' json數組是否不爲零,將標題設置爲第一個標籤。我想檢查ParentVC中的條件,'如果selectedIndex == 2 {//執行檢查}',然後在這裏設置標題。但我無法設法從ParentVc中的MessageVC中獲取值。總是得到零。我嘗試委託,但失敗 –

+0

你可以上傳你的項目在github上? – Rishab

+0

嗨,我已經更新了這個問題。請檢查並建議有什麼問題 –