簡體   English   中英

兩個獨立的UIViewControllers上的UITabBarControllerDelegate-Swift

[英]UITabBarControllerDelegate on two separate UIViewControllers - Swift

我有以下代碼,我試圖在UIViewcontroller上實現“從頂部滾動”,在另一個UIViewController上實現“從開始滾動”。

第一個VC具有表視圖,第二個VC具有收集視圖。

-NearMeViewController-
override func viewDidLoad() {
        super.viewDidLoad()
        self.tabBarController?.delegate = self
        //....
}
extension NearMeViewController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        let tabBarIndex = tabBarController.selectedIndex
        if tabBarIndex == 0 {
            self.nearMeTable.setContentOffset(CGPoint.zero, animated: true)
        }
    }
}

-MapSearchViewController-
override func viewDidLoad() {
        super.viewDidLoad()
        self.tabBarController?.delegate = self
        //....
}

extension MapSearchViewController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        let tabBarIndex = tabBarController.selectedIndex
        if tabBarIndex == 2 && requests.mapEventData.count > 0 {
            self.resultsCollectionView?.scrollToItem(at: IndexPath(row: 0, section: 0),
                                                     at: .left,
                                                     animated: true)
        }
    }
}

它們都連接到相同的UITabBar。 問題是,當我打開應用程序並按tabBarIndex 0時,它將滾動到表格視圖的頂部。

然后,我更改VC,並嘗試按tabBarIndex 2,因此將我帶到集合視圖的第一項。

之后,我回到第一個VC,當我嘗試按下tabBarIndex 0時,tableview不會滾動到頂部(就像我第一次打開該應用程序時所做的那樣)。

但是具有集合視圖的第二個VC可以正常工作。

知道為什么會發生這種情況嗎?

看起來您正在檢查.selectedIndex.selectedIndex ...,但這是當前顯示的選項卡的索引,而不是您“正在訪問”的選項卡的索引。

您更可能希望使用與此類似的代碼:

func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

    if let vc = viewController as? MapSearchViewController {
        // user tapped Map Search tab item
    }

    if let vc = viewController as? NearMeViewController {
        // user tapped Near Me tab item
    }

}

編輯:這是一個簡單的示例,使用子類的UITabBarController。

正常設置情節MyTabBarController ,創建視圖控制器並將其連接為“制表符”,然后將TabBarController的自定義類設置為MyTabBarController 此示例代碼將(希望)易於理解。

一個可運行的示例位於: https : //github.com/DonMag/SWTabBarSubclass

//
//  TabBarSample.swift
//

import UIKit

class FirstViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // all your normal setup stuff....
    }

    func firstViewSpecific(_ aValue: Int) -> Void {
        print("Passed value is:", aValue)
        // do something with the passed value
    }

}

class NearMeViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // all your normal setup stuff....
    }

    func resetMe() -> Void {
        print("resetMe() called in NearMeVC")
        // do whatever you want, such as
        self.nearMeTable.setContentOffset(CGPoint.zero, animated: true)
    }

}

class MapSearchViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // all your normal setup stuff....
    }

    func resetMe() -> Void {
        print("resetMe() called in MapSearchVC")
        // do whatever you want, such as
        if requests.mapEventData.count > 0 {
            self.resultsCollectionView?.scrollToItem(at: IndexPath(row: 0, section: 0),
                                                     at: .left,
                                                     animated: true)
        }
    }

}

class MyTabBarController: UITabBarController, UITabBarControllerDelegate {

    var myValue = 0

    override func viewDidLoad() {
        super.viewDidLoad()

        // make self the UITabBarControllerDelegate
        self.delegate = self
    }

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {

        if let vc = viewController as? FirstViewController {
            myValue += 1
            vc.firstViewSpecific(myValue)
            return
        }

        if let vc = viewController as? NearMeViewController {
            vc.resetMe()
            return
        }

        if let vc = viewController as? MapSearchViewController {
            vc.resetMe()
            return
        }

    }

}

每次出現VC時,viewDidLoad不會被調用,而只會被調用一次(或之前被釋放時)。

vc 0的委托僅設置一次...,然后加載vc1並將其設置為委托...,然后再次設置vc0。

為了使其工作,請在viewWillAppear中設置委托。

注意

一遍又一遍地更改委托是很奇怪的……而使用DonMag的解決方案充其量只能檢查索引是否脆弱。

可能不適用於所有情況,請檢查您的VC是否已設置為

self.tabBarController?.delegate = self

在您的ViewDidLoad()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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