【问题标题】:Swift 3 - Delegate always returns nil valueSwift 3 - 委托总是返回 nil 值
【发布时间】: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


    【解决方案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!

    现在应该可以了。

    【讨论】:

    • 嗨,你能不能请代表告诉我怎么做。因为 ParentViewController,首先被加载,而 MessagesVC() 是第一个选项卡。当我单击第三个选项卡并检查 messages json 数组是否不为零时,将标题设置为第一个选项卡。我想在ParentVC中检查条件,if selectedIndex == 2 { // do the checking },然后在这里设置标题。但我无法从 ParentVc 中的 MessagesVC 获取值。总是为零。我通过委托尝试但失败了
    • 你能把你的项目上传到github上吗?
    • 嗨,我已经更新了这个问题。请检查并提出问题
    • 我做不到。我没有收到任何建议,例如 classname.delegate
    • 我已经更新了帖子。但是,伙计,您需要先花一些时间来了解基础知识。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2018-12-31
    • 2015-12-28
    • 1970-01-01
    • 2016-12-07
    相关资源
    最近更新 更多