Как сделать так, чтобы цикл for in позволил мне выполнить только один переход? - PullRequest
0 голосов
/ 23 марта 2019

У меня есть табличное представление внутри контроллера представления, которое связано с 3 различными контроллерами представления посредством перехода.У каждого есть идентификатор.

Чтобы выполнить переход к соответствующему контроллеру представления, я создал массив, который содержит идентификаторы для каждого перехода.вот так:

var tableauSegues = ["versChapitre1", "versChapitre2", "versChapitre3"]

Чтобы управлять переходом в соответствии с индексом массива, я решил использовать цикл for внутри действия iB, например:

@IBAction func versHistoire(_ sender: UIButton) {

    for i in tableauSegues {

        performSegue(withIdentifier: i, sender: self)
    }

}

проблема в том, что все 3 сегмента выполняются.Я только хочу выполнить одну передачу в то время.

есть идеи?

1 Ответ

1 голос
/ 23 марта 2019

Очевидно, что вы хотите избежать зацикливания, но вместо этого хотите просто использовать tableauSegues[row]. Но хитрость в том, как получить row.

В итоге, вы должны позволить ячейке обрабатывать касание ячейки, и чтобы ячейка сообщала контроллеру табличного представления, когда была нажата его кнопка. Но хитрость заключается в том, что когда он это делает, он должен предоставить ссылку на себя, когда он это делает, чтобы контроллер представления мог определить, к какой строке была нажата его кнопка.

Таким образом, удалите существующий @IBAction непосредственно между кнопкой и контроллером представления и вместо этого подключите его к @IBAction в базовом классе ячейки.

//  CustomCell.swift

import UIKit

protocol CustomCellDelegate: class {
    func didTapButton(_ sender: Any, in cell: CustomCell)
}

class CustomCell: UITableViewCell {
    @IBOutlet weak var customLabel: UILabel!

    static let preferredReuseIdentifier = "CustomCell"

    weak var delegate: CustomCellDelegate?

    func configure(text: String, delegate: CustomCellDelegate) {
        customLabel.text = text
        self.delegate = delegate
    }

    @IBAction func didTapButton(_ sender: Any) {
        delegate?.didTapButton(sender, in: self)
    }
}

Обратите внимание, что когда я сконфигурирую эту ячейку, я хочу, чтобы табличное представление предоставляло не только те значения, которые должны отображаться в ячейке, но и указывало, что это делегат для этой ячейки:

//  ViewController.swift

import UIKit

class ViewController: UIViewController {
    @IBOutlet weak var tableView: UITableView!

    var tableauSegues = ["versChapitre1", "versChapitre2", "versChapitre3"]
}

extension ViewController: UITableViewDataSource {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return tableauSegues.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: CustomCell.preferredReuseIdentifier, for: indexPath) as! CustomCell
        cell.configure(text: "...", delegate: self)
        return cell
    }
}

extension ViewController: CustomCellDelegate {
    func didTapButton(_ sender: Any, in cell: CustomCell) {
        let row = tableView.indexPath(for: cell)!.row
        let identifier = tableauSegues[row]
        performSegue(withIdentifier: identifier, sender: self)
    }
}
...