こんにちは。
dependancy injectionについて理解しようと試みています。
Storyboard を使用したインスタンス化を用いて行うDIはなんとかできたのですが、
UITableViewCell + cellのxibを使用してfunc inject()
を呼ぶところでpresenter
がnilとなってしまいます。
xibの扱いとDIにはまだ不慣れですので、お助けいただけると幸いです。
そもそもこれがDIになっているか不安なのですが。。。
class AppDelegate
内で注入しています。
swift
1class AppDelegate: UIResponder, UIApplicationDelegate { 2 3 var window: UIWindow? 4 5 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 6 7 // 以下、presenterを、各VCに設置したinject()にて注入 8 let mainTabVC = UIStoryboard(name: "MainTab", bundle: nil).instantiateInitialViewController() as! MainTabViewController 9 let userDefault = UserDefault() 10 let presenter = MainTabPresenter(view: mainTabVC, udManager: userDefault) 11 mainTabVC.inject(presenter: presenter, userDefaultManager: userDefault) 12 13 let addTabVC = UIStoryboard(name: "AddTab", bundle: nil).instantiateInitialViewController() as! AddTabViewController 14 let alertHandller = AlertHandller() 15 let addPresenter = AddTabPresenter(view: addTabVC, mainView: mainTabVC, alertHandller: alertHandller) 16 addTabVC.inject(presenter: addPresenter) 17 18 let settingTabVC = UIStoryboard(name: "SettingTab", bundle: nil).instantiateInitialViewController() as! SettingTabViewController 19 let settingPresenter = SettingTabPresenter(view: settingTabVC) 20 settingTabVC.inject(presenter: settingPresenter, alertHandller: alertHandller) 21 22 let vcs = [mainTabVC, addTabVC, settingTabVC] 23 24 let mainTabBar = UIStoryboard(name: "MainView", bundle: nil).instantiateInitialViewController() as! MainTabBarController 25 mainTabBar.setViewControllers(vcs, animated: false) 26 27 // ここまでは問題なし。無事VC内にてpresenterにアクセス可能 28 29 30 // CustomTableViewCellにはxibを使用していて、これだとView内で呼ぶpresenterがnilになる 31 // ListCell.xib xibファイル 32 // ListCell.swift CustomView 33 let listCell = UINib(nibName: "ListCell", bundle: nil).instantiate(withOwner: nil, options: nil).first as! ListCell 34 35 let cellPresenter = ListCellPresenter(view: mainTabVC) 36 listCell.inject(presenter: cellPresenter) 37 38 window = UIWindow(frame: UIScreen.main.bounds) 39 window?.rootViewController = mainTabBar 40 window?.makeKeyAndVisible() 41 42 return true 43 } 44} 45 46// customTableViewCell 47class ListCell: UITableViewCell { 48 49 private let shared = Sharing.shared 50 private var presenter: ListCellPresenter! 51 52 func inject(presenter: ListCellPresenter) { 53 self.presenter = presenter 54 } 55 56 override func awakeFromNib() { 57 super.awakeFromNib() 58 } 59 60 override func setSelected(_ selected: Bool, animated: Bool) { 61 super.setSelected(selected, animated: animated) 62 63 // Configure the view for the selected state 64 } 65 66 @IBAction func favButtonTapped(_ sender: Any) { 67 let row = self.tag 68 presenter.countFavIcon(rowAt: row) //このpresenterがnil 69 } 70} 71 72//cellのpresenter 73 74protocol ListCellPresenterInput { 75 func countFavIcon(rowAt row: Int) 76} 77 78protocol ListCellPresenterOutput: AnyObject { 79 func update() 80} 81 82final class ListCellPresenter: ListCellPresenterInput { 83 84 private let shared = Sharing.shared 85 private weak var view: ListCellPresenterOutput! 86 87 init(view: ListCellPresenterOutput) { 88 self.view = view 89 } 90 91 func countFavIcon(rowAt row: Int) { 92 print("called") 93 view.update() 94 } 95} 96
withOwner: nil
これを withOwner: ListCell.self
にもしてみましたがダメでした。
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/07/08 13:33
2019/07/10 03:21