我正在通過從 API 獲取一些資料來構建一個簡單的電影應用程式。我的應用導航模式如下所示:NavigationController 作為 InitialViewController > TabBarController。TabBarController 包含兩個 ViewController:HomeViewController 和 FavouriteMoviesViewController。我在 HomeViewController 中有一個按鈕,它使用導航推送 SeachViewController 頁面。我也有 DetailsViewController。每當我在 HomeViewController 或 SearchViewController CollectionViewCell 中按下電影海報時,它都會向我顯示 DetailsPageViewController。我正在使用委托模式(當我從 HomeViewController 呈現 DetailsViewController 時,我將 FavouriteMoviesViewController 設定為 DetailsViewController 的委托)從 DetailsViewController 更新 FavouriteMoviesViewController 內的資料,但問題是我不能 當我從 SearchViewController 訪問 DetailsViewController 時設定委托,因為這兩個 ViewController 沒有任何關系。我試圖在 FavouriresViewController 中設定一個觀察者,但在我訪問該 viewController 之前它不會作業
當我從 HomeViewController 顯示 DetailsViewController 并傳遞獲取的資料時,這是我的代碼
// Cell action
func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) {
// Instantiate DetailsViewController and set it's delegate to FavouritesViewController to pass data
let targetVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: DetailsViewController.identifier) as! DetailsViewController
let favMoviesScreen = self.tabBarController?.viewControllers?[0] as! FavouritesViewController
targetVC.changeToFavouriteDelegate = favMoviesScreen
switch collectionView {
case self.trendingMoviesCollectionView:
let selectedMovie = trendingMovies[indexPath.row]
targetVC.movie = selectedMovie
targetVC.genreIDs = selectedMovie.genreIDs
self.navigationController?.present(targetVC, animated: true, completion: nil)
case self.upcomingMoviesCollectionView:
let selectedMovie = upcomingMovies[indexPath.row]
targetVC.movie = selectedMovie
targetVC.genreIDs = selectedMovie.genreIDs
self.navigationController?.present(targetVC, animated: true, completion: nil)
case self.topRatedMoviesCollectionView:
let selectedMovie = topRatedMovies[indexPath.row]
targetVC.movie = selectedMovie
targetVC.genreIDs = selectedMovie.genreIDs
self.navigationController?.present(targetVC, animated: true, completion: nil)
default: break
}
}
這里一切都很好。
這是 DetailsViewController,我在其中顯示電影詳細資訊,我在此處標記最喜歡的電影并在我的 FavouriteMoviesViewController 中添加/洗掉它,這是委托方法:
// MARK: - Button Actions
@objc private func markAsFavourite() {
guard let favouriteMovie = movie else {
print("invalid movie object")
return
}
// check whether the movie is already added into favourite movies array
if !DetailsViewController.favouriteMovies.contains(where: { favouriteMovie.movieId == $0.movieId }) {
addToFavouritesButton.tintColor = .appRedColor
DetailsViewController.favouriteMovies.append(favouriteMovie)
changeToFavouriteDelegate?.addMovie(favouriteMovie)
} else {
addToFavouritesButton.tintColor = .white
DetailsViewController.favouriteMovies.removeAll(where: { $0.movieId == favouriteMovie.movieId})
changeToFavouriteDelegate?.removeMovie(favouriteMovie)
}
}
現在問題出在這里,在我的 SearchViewController 中,我猜是因為這個 ViewController 不屬于 tabBar
// Cell action
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let targetVC = UIStoryboard.init(name: "Main", bundle: nil).instantiateViewController(withIdentifier: DetailsViewController.identifier) as! DetailsViewController
let tabBar = (self.navigationController?.viewControllers[0]) as! UITabBarController
let favMoviesController = tabBar.viewControllers![0] as! FavouritesViewController
targetVC.changeToFavouriteDelegate = favMoviesController
let selectedMovie = filteredMovies[indexPath.row]
targetVC.movie = selectedMovie
targetVC.genreIDs = selectedMovie.genreIDs
self.navigationController?.present(targetVC, animated: true, completion: nil)
}
這只是行不通...
targetVC.changeToFavouriteDelegate = favMoviesController
我能做些什么來解決這個問題嗎?
uj5u.com熱心網友回復:
這可能無法完全回答您的問題,但我的目的是為您指明正確的方向。
該問題可能是幾個問題之一,如果無法運行您的代碼,將很難進行除錯。以下是一些可能性:
- 您的委托可以正確設定,但由于收藏夾視圖不在螢屏上,UI 更新不會執行,并且當您回傳那里時不會進行任何重新加載/重繪
- 也許您沒有訪問所需的收藏夾 ViewController 實體
- 通知不起作用的一個原因,也許你沒有聽它
- 等等
很難說。
在我看來,實作你想要的實作是相當復雜的。
我建議通過以下方式進行簡化:
- 最簡單的解決方案 - 維護一個結構或一類喜歡的電影,應該在類之間傳遞
- 更進一步的做法是將 MVVM 視為發布的評論者之一,并將其??與觀察者(通知)一起使用來更新 UI。我建議查看我喜歡的這個斯坦福講座
- 在這個階段可能有點矯枉過正,但可以閱讀CoreData以查看它是否適合您的需求
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/419491.html
標籤:
上一篇:(SwiftUI)如何讓用戶從Picker中選擇一個值,然后對其進行編輯?
下一篇:UIKit中的Segue和委托
