我的项目采用 MVVM 架构构建,我使用 Coordinator 设计模式来处理导航(全部以编程方式,不涉及 Storyboard)。
它由几个 TableViewController 组成,其中包含用户、相册、照片、帖子和评论,每个都有自己的 TableViewController。在每个用户单元格中,您都可以访问其相册和帖子。选择相册或帖子,您可以查看更多详细信息等...
我从 {JSON} Placeholder API 获取数据并将其显示在表视图上,但似乎无法将数据从第一个传递到下一个。由于我正在使用导航控制器,并且没有转场,因此prepare(for segue:)
在从一个视图导航到另一个视图之前,我不能使用设置下一个表视图。
我通过函数触发导航,didTapAlbums(with userId: Int, by name: String)
并didTapPosts(with userId: Int, by name: String)
调用我的 Coordinator 协议中的方法eventOcurred(with: Event)
设置,将下一个 TableViewController 推入 NavigationController。
这是我的主要协调员课程:
import UIKit
class MainCoordinator: Coordinator {
var navigationController: UINavigationController
init(navigationController: UINavigationController) {
self.navigationController = navigationController
}
func eventOccurred(with type: Event) {
switch type {
case .didTapAlbums:
var albumsTableViewController: UITableViewController & Coordinating = AlbumTableViewController()
albumsTableViewController.coordinator = self
navigationController.pushViewController(albumsTableViewController, animated: true)
case .didTapAlbumCell:
var photoTableViewController: UITableViewController & Coordinating = PhotoTableViewController()
photoTableViewController.coordinator = self
navigationController.pushViewController(photoTableViewController, animated: true)
case .didTapPhotoCell:
var detailsViewController: UIViewController & Coordinating = DetailsViewController()
detailsViewController.coordinator = self
navigationController.pushViewController(detailsViewController, animated: true)
case .didTapPosts:
var postsTableViewController: UITableViewController & Coordinating = PostTableViewController()
postsTableViewController.coordinator = self
navigationController.pushViewController(postsTableViewController, animated: true)
case .didTapPostCell:
var commentTableViewController: UITableViewController & Coordinating = CommentTableViewController()
commentTableViewController.coordinator = self
navigationController.pushViewController(commentTableViewController, animated: true)
}
}
func start() {
var challengeViewController: UITableViewController & Coordinating = ChallengeViewController()
challengeViewController.coordinator = self
navigationController.setViewControllers([challengeViewController], animated: false)
}
}
这是第一个 TableViewController,它显示用户:
import Alamofire
import UIKit
class ChallengeViewController: UITableViewController, Coordinating {
var coordinator: Coordinator?
let userViewModel = UserViewModel()
var users = [User]()
override func viewDidLoad() {
super.viewDidLoad()
tableView.dataSource = self
tableView.register(UserTableViewCell.self, forCellReuseIdentifier: "UserCell")
tableView.rowHeight = 233
userViewModel.fillUsers { data in
self.users = data
DispatchQueue.main.async {
self.tableView.reloadData()
}
}
}
}
// MARK: - TableView DataSource
extension ChallengeViewController {
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return users.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserTableViewCell
let user = users[indexPath.row]
cell.selectionStyle = .none
cell.id = user.id
cell.initialsLabel.text = String(user.name.prefix(2))
cell.nameLabel.text = user.name
cell.userNameLabel.text = user.username
cell.emailLabel.text = user.email
cell.phoneLabel.text = user.phone
cell.delegate = self
cell.backgroundColor = indexPath.row % 2 == 0 ? .white : UIColor(white: 0.667, alpha: 0.2)
return cell
}
}
// MARK: - Navigation
extension ChallengeViewController: UserTableViewCellDelegate {
func didTapAlbums(with userId: Int, by name: String) {
coordinator?.eventOccurred(with: .didTapAlbums)
}
func didTapPosts(with userId: Int, by name: String) {
coordinator?.eventOccurred(with: .didTapPosts)
}
}
我要做的就是将值传递给userId
下name
一个控制器。
编辑:协调器和协调协议
import UIKit
enum Event {
case didTapAlbums, didTapPosts, didTapAlbumCell, didTapPhotoCell, didTapPostCell
}
protocol Coordinator {
var navigationController: UINavigationController { get set }
func eventOccurred(with type: Event)
func start()
}
protocol Coordinating {
var coordinator: Coordinator? { get set }
}