#ios #swift
#iOS #swift
Вопрос:
Я создал TabBarController
файл, в котором я хотел бы обмениваться данными между вкладками. Каждая вкладка имеет свой собственный контроллер. Я прочитал о многих способах достижения этого в iOS и Swift. Читая онлайн, я прочитал о недостатках Singleton
шаблона, таких как глобальная изменчивость и сниженная тестируемость, и решил не использовать этот шаблон. Я решил использовать dependency injection
шаблон.
Мне было интересно, правильно ли я использую этот шаблон в Swift или я нарушаю принципы разработки iOS. Как новый разработчик iOS, я хотел бы услышать ответы о том, правильно я поступаю или неправильно.
Вот мой TabBarController
класс:
class ExampleTabsController: UITabBarController {
var exampleModel: ExampleModel = ExampleModel()
override func viewDidLoad() {
super.viewDidLoad()
loadViewControllers()
}
func loadViewControllers() {
//initialize the storyboards with their respective controllers
let firstViewController = UIStoryboard(name: "First", bundle:nil).instantiateViewController(identifier: "FirstView") as! FirstController
let SecondViewController = UIStoryboard(name: "Second", bundle:nil).instantiateViewController(identifier: "SecondView") as! SecondController
//create the tab bar items for each view controller
firstViewController.tabBarItem = UITabBarItem(tabBarSystemItem: .more, tag: 0)
secondViewController.tabBarItem = UITabBarItem(tabBarSystemItem: .more, tag: 1)
//create a list of all the controllers that will be loaded into the tab bar
let tabBarList = [firstViewController, secondiewController]
//load the tab bar
viewControllers = tabBarList
}
И вот как мои Controllers
кодируются.
class FirstController: UIViewController {
@IBOutlet weak var list: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(_ animated: Bool) {
let tabBar = tabBarController as! ExampleTabsController
list.text = String(describing:tabBar.exampleModel.exampleList)
}
}
Теперь все это работает нормально, и я могу отображать данные в виде меток на Views
вкладках, но мне было интересно, будет ли это считаться плохой практикой разработки iOS. В Интернете есть много статей с множеством разных способов, и это показалось хорошим способом без использования Singleton
шаблона со всеми его недостатками. Мне было интересно, правильно ли используется мой пример dependency injection
? Любая помощь приветствуется, спасибо!!
Ответ №1:
let tabBar = tabBarController as! ExampleTabsController
Но что, если TabBarController вашего ExampleViewController будет другим UITabBarController или nil? Ваша архитектура перестанет работать.
Ваш ExampleTabsController и FirstController связаны очень жестко.
Я могу предложить вам небольшое исправление:
Добавьте ссылку на вашу модель внутри FirstViewController:
var model: ExampleModel?
Введите его в функцию loadViewControllers () вашего ExampleTabsController:
firstViewController.model = self.exampleModel
Теперь ваш ExampleTabsController и FirstViewController не связаны.
Комментарии:
1. Это здорово и дает мне лучшее представление о внедрении зависимостей с помощью Swift! Просто вопрос, допустим, я хочу, чтобы эта модель была разделена между разными вкладками. Могу ли я назначить эту модель из TabBarController во все его представления вкладок, и поскольку она имеет ссылочный тип (это класс), все они будут использовать одну и ту же модель и, следовательно, смогут изменять и обмениваться данными между вкладками?
2. Да, они будут.