J'ai un utableview à l'intérieur d'un Uiscrollview. L'UitailView a désactivé désactivé et dispose de tous les Delgates requis dans la zone ViewController (comme on peut le voir dans le code ci-dessous). Cependant, lorsque je clique sur un élément de la table, DrakeSelectrowat n'est jamais appelé (Didhighlightrowat n'est également jamais appelé). Pourquoi n'est-ce pas appelé? Comment puis-je le réparer?
class NewsViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout {
private static let headlineArticleReuseIdentifier = "HeadlineArticleCell"
private static let categoryCellReuseIdentifier = "NewsCategoryCell"
@IBOutlet weak var headlineArticlesPreviewList: UITableView!
private var bindings = Set<AnyCancellable>()
private var viewModel: NewsViewModel = NewsViewModel()
private var headlineArticles: [Article] = []
@IBOutlet weak var headlineTitle: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
self.navigationController?.setNavigationBarHidden(true, animated: false)
headlineArticlesPreviewList.delegate = self
headlineArticlesPreviewList.dataSource = self
let cancellable = viewModel.$viewState.sink(receiveValue: { state in
switch state {
case let .data(data):
self.setData(data: data)
print()
case let .error(error):
print(error)
case .loading:
print()
}
})
bindings.insert(cancellable)
}
private func setData(data: NewsViewModel.ViewState.Data) {
self.headlineArticles = data.headlineArticles
self.headlineTitle.text = data.headlineCategory.displayName
self.headlineArticlesPreviewList.reloadData()
}
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return headlineArticles.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
guard let cell = headlineArticlesPreviewList.dequeueReusableCell(
withIdentifier: NewsViewController.headlineArticleReuseIdentifier,
for: indexPath)
as? HeadlineArticleTableViewCell else {
fatalError("could not cast to headline article")
}
let headlineArticle = headlineArticles[indexPath.item]
cell.setArticle(article: headlineArticle)
return cell
}
func tableView(_ tableView: UITableView, didHighlightRowAt indexPath: IndexPath) {
print()
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
self.performSegue(withIdentifier: "HeadlineArticleSegue", sender: self)
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "HeadlineArticleSegue" {
let detailViewController = segue.destination
as! ArticleViewController
let articleIndexPath = headlineArticlesPreviewList.indexPathForSelectedRow!
let row = articleIndexPath.row
detailViewController.article = headlineArticles[row]
}
}
}
3 Réponses :
J'ai eu un jeu de scénario de Storyboard qui avait un identifiant de restauration incorrect p>
de ma perspective Cette mise en page d'éléments dans le storyboard n'est pas bonne. P>
Je vous suggère d'utiliser 2 vues intégrées, 1 pour la visualisation de la TableView et d'une autre vue de la collection et utilisez des délégués sur la gestion de la ligne DidingSelect pour la visualisation de TableView et Collectionview dans ces contrôleurs d'affichage intégrés, puis utilisez des protocoles et des délégués pour informer le contrôleur de la vue principale. faire des tâches spécifiques. p>
Avec cette approche, votre contrôleur d'affichage actuel sera léger et ne fera que des tâches spécifiques et déléguera le rendu de la vue de tableau et de la vision de la collection aux contrôleurs de visualisation intégrés respectifs. P>
Pourriez-vous s'il vous plaît se référer, quels paramètres de la vue de table vous personnalisent?
Vérifiez Uiscrollview StandumSize. Je suppose en fait la vue de la table est un droit diplayé, mais quelque chose (comme mal contente des parents) l'empêchent de se faire toucher ... Vous avez également vérifié "Peut annuler sur le défilement" qui n'est pas bon pour votre portée.