簡體   English   中英

委托方法沒有被 UITabBarController 調用

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM