0

我的项目采用 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)
    }
}

我要做的就是将值传递给userIdname一个控制器。

编辑:协调器和协调协议

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 }
}
4

0 回答 0