[英]delegate method not getting called with UITabBarController
在FourthViewController
中,我有一個 slider,其值范圍為 1 到 1000。設置的值通過委托發送到PatternViewController
,它應該用於做某事(我將打印用於測試目的)。
我以前和代表一起工作過,一切都好,多次檢查代碼,堆棧上有多個答案,我似乎找不到問題。 任何幫助將非常感激
更新:我添加了一個按鈕,以便更容易跟蹤。 事實證明,第一次按下按鈕,什么都沒有發生。 但是如果我首先檢查PatternViewController
,然后我 go 回到FourthViewController
並按下按鈕,代表就會被觸發。 有人知道為什么會這樣嗎?
第四視圖控制器
import UIKit
class FourthViewController: UIViewController {
//MARK: Outlets
@IBOutlet var persistenceButton: UIButton!
@IBOutlet var persistenceSlider: UISlider!
@IBOutlet var persistenceLabel: UILabel!
weak var delegate: FourthViewControllerDelegate?
//MARK: Stored Properties - Constants
let userDefaults = UserDefaults.standard
let keyName = "sliderValue"
//MARK: Initializer
override func viewDidLoad() {
super.viewDidLoad()
loadSliderValue()
initialSetUp()
}
//MARK: Actions
@IBAction func handleValueChanged(_ sender: UISlider) {
updateLabel()
persistSliderValue(value: persistenceSlider.value, key: keyName)
}
//MARK: Methods
func updateLabel() {
persistenceLabel.text = String(format: "%.2f", persistenceSlider.value)
}
func persistSliderValue(value: Float, key: String) {
userDefaults.set(value, forKey: key)
}
func loadSliderValue() {
let persistedValue = userDefaults.float(forKey: keyName)
persistenceSlider.value = persistedValue
updateLabel()
}
}
func initialSetUp() {
persistenceButton.addTarget(self, action: #selector(handleButtonPressed), for: .touchUpInside)
}
@objc func handleButtonPressed() {
delegate?.valueChanged(value: persistenceSlider.value)
}
}
模式視圖控制器
import UIKit
class PatternViewController: UIViewController, FourthViewControllerDelegate {
override func viewDidLoad() {
super.viewDidLoad()
setUp()
}
func setUp() {
if let tabBar = self.tabBarController, let viewController = tabBar.viewControllers, let fourthViewController = viewController[3] as? FourthViewController {
fourthViewController.delegate = self
}
}
func valueChanged(value: Float) {
print(value)
}
}
這取決於您如何實例化選項卡視圖 controller。 例如,如果您使用情節提要執行此操作,則各個選項卡的視圖控制器會延遲實例化,僅在用戶點擊它們時才實例化。 (這有助於減少因實例化所有四個選項卡的視圖控制器而導致的延遲。)
While you theoretically could go ahead and have the tab bar controller instantiate the four view controllers programmatically up front, rather than just-in-time via the storyboard, I might instead consider specifying a UITabBarControllerDelegate
for the tab bar controller. 讓標簽欄控制器的委托方法更新相關標簽的視圖控制器的 model。
這是一個帶有兩個選項卡的示例,第一個具有 slider,第二個具有顯示滑塊值的 label。 In this simplified example, I've moved the model object (the value associated with the slider) into the tab bar controller, and it passes it to the second view controller when you select the associated tab.
// TabViewController.swift
import UIKit
class TabBarController: UITabBarController {
var value: Float = 0.5
override func viewDidLoad() {
super.viewDidLoad()
delegate = self
}
}
// MARK: - UITabBarControllerDelegate
extension TabViewController: UITabBarControllerDelegate {
func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
guard let viewController = viewController as? SecondViewController else { return }
viewController.value = value
}
}
和
// FirstViewController.swift
import UIKit
class FirstViewController: UIViewController {
@IBOutlet weak var slider: UISlider!
override func viewDidLoad() {
super.viewDidLoad()
guard let tabBarController = tabBarController as? TabViewController else { return }
slider.value = tabBarController.value
}
@IBAction func didAdjustSlider(_ sender: UISlider) {
guard let tabBarController = tabBarController as? TabViewController else { return }
tabBarController.value = sender.value
}
}
和
// SecondViewController.swift
import UIKit
class SecondViewController: UIViewController {
@IBOutlet weak var label: UILabel!
var value: Float = 0 { didSet { updateLabel() } }
let formatter: NumberFormatter = {
let formatter = NumberFormatter()
formatter.numberStyle = .percent
return formatter
}()
override func viewDidLoad() {
super.viewDidLoad()
updateLabel()
}
func updateLabel() {
label?.text = formatter.string(for: value)
}
}
Probably needless to say, I not only set the base view controller class for the two tab's view controllers, but also set the base class for the tab bar controller's storyboard scene to the above TabBarController
.
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.