在 Swift 中的 UI 上设置按钮标题不显示
Set Button Title not showing on UI in Swift
我想达到什么目的?
我有 2 UITableViewController : AddCardVC
和 ListDeckController
。我想将 ListDeckController
中选定的 Deck 传递给 AddCardVC
,然后将 updateUI
传递给 AddCardVC
我的代码:(我在 Swift 5
、iOS 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)
}
}
我想达到什么目的?
我有 2 UITableViewController : AddCardVC
和 ListDeckController
。我想将 ListDeckController
中选定的 Deck 传递给 AddCardVC
,然后将 updateUI
传递给 AddCardVC
我的代码:(我在 Swift 5
、iOS 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)
}
}