在 Swift 中的 UI 上设置按钮标题不显示

Set Button Title not showing on UI in Swift

我想达到什么目的? 我有 2 UITableViewController : AddCardVCListDeckController。我想将 ListDeckController 中选定的 Deck 传递给 AddCardVC,然后将 updateUI 传递给 AddCardVC

我的代码:(我在 Swift 5iOS 13 上构建)

ListDeckController.swift:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    if let addCardVC = storyboard.instantiateViewController(withIdentifier: "AddCard") as? AddCardVC {
        if let deck = allDecks?[indexPath.row] {
            addCardVC.selectedDeck = deck
        }
    }
    self.navigationController?.popViewController(animated: true)
}

AddCardVC.swift:

var selectedDeck: Deck?
    {
        didSet {
            viewWillAppear(true)
        }
    }

override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if let deck = selectedDeck {
            //Update UI
            self.chooseDeckButton.setTitle(deck.name, for: .normal)
            print(chooseDeckButton.titleLabel?.text ?? "")

            self.tableView.reloadData()
        }
    }

发生什么事了?

AddCardVC中选择Deck后,控制台打印出chooseDeckButton.titleLabel?.text = "My Deck",这就是我想要的。但是 UI 上的按钮标题是 "Choose your deck" Console image Button on UI

那么,为什么我的 UI 上没有显示 setButtonTitle?

感谢您的宝贵时间

首先,为 DeckDelegate 创建协议

protocol SelectedDeckDelegate {
    func didSelectDeck(selectedDeck : Deck)
}

现在在您的 ListDeckController.swift 中实施委托

var deckDelegate : SelectedDeckDelegate?

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
{ 
if let deck = allDecks?[indexPath.row] {
    deckDelegate?.didSelectDeck(selectedDeck: deck)
    self.navigationController?.popViewController(animated: true)
} else {
    print("deck is empty")
}  
}

并且在您的 AddCardVC 中,当导航到 ListDeckController 时,将委托分配给自己

// Make AddCardVC conform to SelectedDeckDelegate

class AddCardVC : UIViewController, SelectedDeckDelegate {


   override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        if let deck = selectedDeck {
            //Update UI
            self.chooseDeckButton.setTitle(deck.name, for: .normal)
            print(chooseDeckButton.titleLabel?.text ?? "")

            self.tableView.reloadData()
        }
    }

    // assign the delegate to self here

    @IBAction func selectDeckBtnAction(_ sender : Any) {
        let vc = storyboard.instantiateViewController(withIdentifier: "ListDeckController") as? ListDeckController
        vc.deckDelegate = self
        self.navigationController?.pushViewController(vc, animated: true)
    }

    // this will get called whenever selectedDeck is updated from ListDeckController
    func didSelectDeck(selectedDeck: Deck) {
        self.selectedDeck = selectedDeck
        chooseDeckButton.setTitle(selectedDeck.name , for: .normal)
    }
 }