如何确保我的 for in 循环使我只能执行一个 segue?
how to make sure that my for in loop enables me to perform only one segue?
我在视图控制器中有一个表视图,它通过 segue 连接到 3 个不同的视图控制器。每个都有一个标识符。
为了对相应的视图控制器执行转场,我创建了一个数组,其中包含每个转场的标识符。像这样:
var tableauSegues = ["versChapitre1", "versChapitre2", "versChapitre3"]
为了根据数组的索引管理 segue,我选择在 iB 操作中使用 for in 循环,如下所示:
@IBAction func versHistoire(_ sender: UIButton) {
for i in tableauSegues {
performSegue(withIdentifier: i, sender: self)
}
}
问题是所有 3 个转场都已执行。我只想一次执行一个 segue。
有什么想法吗?
显然,您想避免循环,而只想使用 tableauSegues[row]
。但诀窍是如何获得 row
.
最重要的是,您应该让单元格处理单元格的点击,并让单元格在其按钮被点击时通知 table 视图控制器。但诀窍在于,当它这样做时,它应该在这样做时提供对自身的引用,以便视图控制器可以确定哪一行的按钮被点击了。
因此,直接删除按钮和视图控制器之间的现有 @IBAction
,而是将其连接到单元格底部 class 中的 @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)
}
}
请注意,当我配置该单元格时,我将让 table 视图不仅提供单元格中需要显示的任何值,而且指示它是该单元格的委托:
// 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)
}
}
我在视图控制器中有一个表视图,它通过 segue 连接到 3 个不同的视图控制器。每个都有一个标识符。
为了对相应的视图控制器执行转场,我创建了一个数组,其中包含每个转场的标识符。像这样:
var tableauSegues = ["versChapitre1", "versChapitre2", "versChapitre3"]
为了根据数组的索引管理 segue,我选择在 iB 操作中使用 for in 循环,如下所示:
@IBAction func versHistoire(_ sender: UIButton) {
for i in tableauSegues {
performSegue(withIdentifier: i, sender: self)
}
}
问题是所有 3 个转场都已执行。我只想一次执行一个 segue。
有什么想法吗?
显然,您想避免循环,而只想使用 tableauSegues[row]
。但诀窍是如何获得 row
.
最重要的是,您应该让单元格处理单元格的点击,并让单元格在其按钮被点击时通知 table 视图控制器。但诀窍在于,当它这样做时,它应该在这样做时提供对自身的引用,以便视图控制器可以确定哪一行的按钮被点击了。
因此,直接删除按钮和视图控制器之间的现有 @IBAction
,而是将其连接到单元格底部 class 中的 @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)
}
}
请注意,当我配置该单元格时,我将让 table 视图不仅提供单元格中需要显示的任何值,而且指示它是该单元格的委托:
// 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)
}
}