![](/img/trans.png)
[英]Programmatically transitioning between two UIViewControllers (Xcode 9, Swift 4)
[英]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.