2017-06-30 20 views
0

私は、UIViewController上で "スクロールトップ"と別のUIViewControllerで "スクロール開始"を達成しようとしている次のコードがあります。UITabBarControllerDelegate 2つの別々のUIViewControllerで - Swift

最初のVCにはテーブルビューがあり、2番目の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は上にスクロールしていません(最初にアプリケーションを開いたときのように)。

しかし、コレクションビューの2番目のVCは正常に動作しています。

なぜこのようなことが起こるのでしょうか?

答えて

0

あなたはtabBarControllerの.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を使用して、簡単な例です。

View Controllerを作成し、それらを「タブ」として接続し、次に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 
     } 

    } 

} 
+0

と私はどのビューコントローラーにこれを置く必要がありますか? –

+0

このタイプのタスクのために 'UITabBarController'をサブクラス化しました...あるいは、別の' NSObject、UITabBarControllerDelegate'クラスを作成してそれをデリゲートとして割り当てるか、最初のタブのView Controllerに置くことができます。私はサブクラス化をお勧めしたい。 – DonMag

+0

そして 'UITabBarController'をサブクラス化すれば、どうすれば他のvcsからtableviewやcollectionviewにアクセスできますか? –

1

のviewDidLoad VCが表示されますが、一度だけ(またはそれが前に割り当て解除されたときに)毎回呼び出されていない

VC 0のデリゲートが設定されています一度だけ...そして、vc1がデリゲートとして読み込まれ、設定されますが、vc0は再び表示されません。

これを動作させるには、viewWillAppearでデリゲートを設定します。このために何度もデリゲートを変更

ノート

は奇妙である...とインデックスをチェックすること脆弱であり、せいぜいDonMagのソリューションで行きます。

+0

あなたは 'viewDidLoad'についてのポイントを持っています! 'viewDidAppear'でも動作しますが、@DonMagの答えを理解しているかどうかはわかりません –

関連する問題