К сожалению, ваш пример кода непостижим.Однако кажется, что вы спрашиваете, как передавать данные между двумя контроллерами представления, которые подключены через контроллер представления панели вкладок.Ниже приведен один из способов сделать это ...
Чтобы использовать этот код, вам нужно только назначить функцию для TabBarController.logic
, которая принимает TabBarController.Inputs
в качестве входного параметра и возвращаетTabBarController.Outputs
.Вы можете сделать это назначение в AppDelegate.
Ключевым моментом в этом коде является то, что каждый подкласс ViewController содержит struct Inputs
, struct Outputs
и var logic
.
Inputs
имеет все элементы пользовательского интерфейса, в которые пользователь может ввести (например, кнопки и TextFields), а Outputs
имеет все элементы пользовательского интерфейса, которые может видеть пользователь (например, текст метки,isHidden flags.)
Var logic
- это замыкание, которое содержит всю логику для этого контроллера представления.Обратите внимание, что это может быть назначено.Это означает, что вы можете разрабатывать и тестировать логику независимо от контроллера представления, и при необходимости вы можете предоставить контроллеру представления другой логический объект в зависимости от контекста.
Для более сложного примера кода, в котором вместо этого используется координаторвстраивания кода в контроллер представления контейнера, см. этот репозиторий: https://github.com/danielt1263/RxEarthquake
class TabBarController: UITabBarController {
struct Inputs {
let login: Observable<Void>
}
struct Outputs {
let transactions: Observable<[Transaction]>
}
var logic: (Inputs) -> Outputs = { _ in fatalError("Forgot to set logic.") }
private let bag = DisposeBag()
override func viewDidLoad() {
super.viewDidLoad()
let settings = children[0] as! SettingsViewController
let transactionList = children[1] as! TransactionListViewController
let login = PublishSubject<Void>()
let outputs = logic(Inputs(login: login.asObservable()))
let bag = self.bag
settings.logic = { inputs in
inputs.login
.bind(to: login)
.disposed(by: bag)
return SettingsViewController.Outputs()
}
transactionList.logic = { inputs in
return TransactionListViewController.Outputs(transactions: outputs.transactions)
}
}
}
class SettingsViewController: UIViewController {
struct Inputs {
let login: Observable<Void>
}
struct Outputs {
}
var logic: (Inputs) -> Outputs = { _ in fatalError("Forgot to set logic.") }
private let bag = DisposeBag()
@IBOutlet weak var login: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
_ = logic(Inputs(login: login.rx.tap.asObservable()))
}
}
class TransactionListViewController: UIViewController {
struct Inputs {
}
struct Outputs {
let transactions: Observable<[Transaction]>
}
var logic: (Inputs) -> Outputs = { _ in fatalError("Forgot to set logic.") }
private let bag = DisposeBag()
@IBOutlet weak var transactionTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
let output = logic(Inputs())
let dataSource = MyDataSource()
output.transactions
.bind(to: transactionTableView.rx.items(dataSource: dataSource))
.disposed(by: bag)
}
}