2017-09-20 1 views
0

J'ai une sous-classe de UITabBarController a déclaré comme suitUITabBarController didSelect et shouldSelect pas appelé plus après la présentation et rejetant webView

class TabbarViewController: UITabBarController, UITabBarControllerDelegate { 
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool { 
     self.currentTabIndex = tabBarController.selectedIndex 

     if self.currentTabIndex == 2 { 
      let reportVC = UIWindow.getVisibleViewControllerFrom(tabBarController) as? ReportsViewController 

      if let reportsViewController = reportVC { 
       if reportsViewController.reportTableView.numberOfRows(inSection: 0) > 0 { 
        reportVC?.reportTableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) 

        let navVC = viewController as? UINavigationController 
        let destinationVC = navVC?.viewControllers.last as? ReportsViewController 

        return (destinationVC != nil) ? false : true 
       } 
      } 
     } 
     return true 
    } 

    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) { 
     let newIndex = tabBarController.selectedIndex 

     let tabIndexList = [0, 1] 

     if self.currentTabIndex == newIndex && tabIndexList.contains(newIndex) { 
      let hbgViewController = (newIndex == 2) 
       ? tabBarController.selectedViewController as! UINavigationController 
       : tabBarController.selectedViewController as! DLHamburguerNavigationController 

      switch newIndex { 
      case 0: 
       let alertsViewController = hbgViewController.viewControllers[0] as! AlertsViewController 
       alertsViewController.alertsTableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) 
       break 
      case 1: 
       let newsViewController = hbgViewController.viewControllers[0] as! NewsViewController 
       newsViewController.newsTableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: true) 
       break 
      default: 
       break 
      } 
     } 
    } 
} 

Lorsqu'un utilisateur tape sur l'onglet sélectionné, les rouleaux de Tableview vers le haut. Cela fonctionne comme prévu, cependant, lorsque l'utilisateur appuie sur un élément dans la vue de table, un webview est chargé avec un article de nouvelles à distance. Une fois que la vue est ignorée, le code ci-dessus ne fonctionne plus, Les onglets de navigation fonctionnent, mais didSelect et shouldSelect ne sont plus appelés. Je ne sais pas pourquoi.

Voilà comment est présenté le WebView:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    let newImageSource = self.newsArticles?[indexPath.row].getImageUrl(type: Article.FireNewsImageType.NewsFeed) 

    let articleURLString = self.newsArticles?[indexPath.row].url 

    let webViewController = GDWebViewController() 
    webViewController.title = self.newsArticles?[indexPath.row].title 
    let webVCNav = UINavigationController(rootViewController: webViewController) 

    webViewController.showsToolbar = false 
    webViewController.progressIndicatorStyle = .both 
    webViewController.loadURLWithString(articleURLString!) 

    let cancel = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(NewsViewController.dismissVC)) 
    webViewController.navigationItem.rightBarButtonItem = cancel 

    self.present(webVCNav, animated: true, completion: nil) 
} 

GDWebViewController se trouve ici si nécessaire: https://gist.github.com/elimence/91cf35dfe677b38b23a27c6d54d44285

Les pointeurs serait apprécié merci :)

+0

Salut, avez-vous défini le 'delegate'' TabbarViewController' à lui-même? –

+1

@ZonilyJame damn! c'est la raison. Je l'ai défini dans viewDidLoad et désactivé dans viewWillDisappear, mais j'ai oublié de le redéfinir dans viewWillAppear. Je suis super reconnaissant :) Si vous fournissez une réponse, je l'accepterai. –

Répondre

1

Il semble que vous êtes ne pas régler le UITabBarController de delegate à votre TabbarViewController classe

Vous pouvez soit le placer sur viewDidLoad() ou une autre partie de votre code comme ceci.

override func viewDidLoad() { 
    super.viewDidLoad() 

    // this code right here. 
    self.delegate = self 
}