0

Каков наилучший способ передачи данных в UITabBarController из UIViewController в Swift 3?Передача данных в Programmatic UITabBarController

Я создаю приложение для одного вида, и у меня есть представление деталей, которое необходимо разделить на 4 секции. Я хочу использовать TabBar для достижения этого и передать идентификатор из списка в UIViewController, а затем передать это значение для каждого отдельного UIViewController в TabBar. Это значит, что я могу вызвать веб-метод, который принимает идентификатор для заполнения данных в отдельных представлениях.

Приложение конвертируется из Obj-C с раскадровки в Swift 3 без раскадровки, поэтому у меня нет доступа к обычным определениям segue, которые у меня были. Я также использовал UserDefaults в версии Obj-C, чтобы сохранить выбранный идентификатор, а затем вытащить его снова в отдельных видах. Однако я не убежден, что это лучший способ добиться того, что я хочу.

До сих пор я пробовал пропустить, получив доступ к классу UITabBarController в исходном UIViewController и установив переменную в ViewController, а затем передав ее на ViewController на первой вкладке. Это работает, если я перехожу от UIViewController к UIViewController (первое представление в TabBar, но выполняется автономно), но не работает, когда целевым контроллером является TabBarController.

Я также пробовал отправлять уведомление в ViewControler и наблюдать результат в TabBarController. Однако код наблюдения никогда не вызывается. Я использую:

Selected Row:

NotificationCenter.default.post(name: notificationName, object: selectedRowID) 

Тогда в ViewDidLoad на TabBarController (также попытался viewDidAppear и viewWillAppear):

NotificationCenter.default.addObserver(self, selector: #selector(setID), name: notificationName, object: nil) 

Вышеприведенные работает, но только тогда, когда я выбираю вторую вкладку, а затем вернитесь к первой вкладке, а затем ее дважды вызываете!?!?!

Я также пробовал класс Singleton, но это просто не работает.

Использует UserDefaults действительно лучший способ сделать это?

ответ

1

Вы можете создать новый класс, удерживающий переменные для передачи значения:

class MyTabController: UITabBarController { 
    var myPassedString = String() 
} 

Перейти к раскадровке, выберите контроллер бара вкладки и откройте инспектор удостоверений, изменить класс: MyTabController.

let tabBarController = window?.rootViewController as? UITabBarController 

Определить в каждом ViewController, где вам нужно общие данные:

var myPassedString = String() 

Чтобы сделать эту переменную общего, кода в каждом ViewController:

override func viewDidLoad() { 
    super.viewDidLoad() 
    myPassedString = (tabBarController as! MyTabController).myPassedString 
} 
0

Спасибо. Я не использую раскадровку.

Понял работает с помощью синглтона после осознания, что 1. Чтобы получить значения обратно необходимо вызвать одиночки в viewWillAppear, а не viewDidLoad и 2.При программном создании этого вида viewWillAppear первого дочернего представления в TabBar наблюдается вместо viewWillAppear самого фактического контроллера TabBar.

для справки для тех, кто еще пытается сделать то же, мой код следующим образом

open class LastAccessedEvent { 
    var ID : String = "" 
    class var sharedInstance : LastAccessedEvent { 
     struct Static { 
      static let instance : LastAccessedEvent = LastAccessedEvent() 
    } 
     return Static.instance 
    } 

    var EventID : String { 
     get{ 
      return self.ID 
     } 

     set { 
      self.ID = newValue 
     } 
    } 
} 

затем в viewWillAppear по мнению ребенка,

if !LastAccessedEvent.sharedInstance.ID.isEmpty{ 
     let myEventID = LastAccessedEvent.sharedInstance.ID 
    }