Show/hide table 使用 UISwitch 查看单元格
Show/hide table view cell using UISwitch
我想在动态 table 视图中使用 UISwitch
到 show/hide 一个 tableViewCell。
UISwitch 定义在 `UITableViewCell 的 class 中。
@IBOutlet weak var switchState: UISwitch!
我想在另一个文件中说明如果此开关打开,行数将为 5,否则应为 4
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let test = PopupViewCell()
if test.switchState?.isOn == true {
detailsTableView.reloadData()
return 5
} else {
return 4
}
}
但它不起作用,它总是显示 `return 4。
我也测试一下:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let test = PopupViewCell()
if test.switchState.isOn {
detailsTableView.reloadData()
return 5
} else {
return 4
}
}
但是我会得到这个错误:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
我不确定在这个过程之前我是否必须使用一些动作函数,如果有人能帮助我,我将不胜感激。
最适合初学者的方法是委托。当 Switch 单元检测到 .valueChanged
事件时,它应该将其转发给委托。代表依次更新其是否显示开关的模型,然后重新加载 tableView
.
这是一个游乐场示例:
import UIKit
import PlaygroundSupport
protocol SwitchDelegate: class {
func toggle(isOn: Bool)
}
class SwitchCell: UITableViewCell {
private lazy var switchControl: UISwitch = {
let switchControl = UISwitch()
contentView.addSubview(switchControl)
switchControl.translatesAutoresizingMaskIntoConstraints = false
switchControl.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12).isActive = true
switchControl.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
switchControl.addTarget(self, action: #selector(toggleSwitch(_:)), for: .valueChanged)
return switchControl
}()
private weak var delegate: SwitchDelegate?
override func awakeFromNib() {
super.awakeFromNib()
}
func configure(isOn: Bool, delegate: SwitchDelegate) {
switchControl.isOn = isOn
self.delegate = delegate
}
@objc private func toggleSwitch(_ sender: UISwitch) {
delegate?.toggle(isOn: sender.isOn)
}
}
class ViewController: UITableViewController {
private let data = (0..<5).map { [=10=] + 1 }
private var isOn = true
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: String(describing: UITableViewCell.self))
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count + (isOn ? 1 : 0)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if isOn && indexPath.row == 0 {
let switchCell = SwitchCell(style: .default, reuseIdentifier: String(describing: SwitchCell.self))
switchCell.configure(isOn: isOn, delegate: self)
return switchCell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: UITableViewCell.self), for: indexPath)
let dataIndex = indexPath.row - (isOn ? 1 : 0)
cell.textLabel?.text = String(describing: data[dataIndex])
return cell
}
}
}
extension ViewController: SwitchDelegate {
func toggle(isOn: Bool) {
self.isOn = isOn
tableView.reloadData()
}
}
PlaygroundPage.current.liveView = ViewController()
我想在动态 table 视图中使用 UISwitch
到 show/hide 一个 tableViewCell。
UISwitch 定义在 `UITableViewCell 的 class 中。
@IBOutlet weak var switchState: UISwitch!
我想在另一个文件中说明如果此开关打开,行数将为 5,否则应为 4
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let test = PopupViewCell()
if test.switchState?.isOn == true {
detailsTableView.reloadData()
return 5
} else {
return 4
}
}
但它不起作用,它总是显示 `return 4。 我也测试一下:
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let test = PopupViewCell()
if test.switchState.isOn {
detailsTableView.reloadData()
return 5
} else {
return 4
}
}
但是我会得到这个错误:
Thread 1: Fatal error: Unexpectedly found nil while unwrapping an Optional value
我不确定在这个过程之前我是否必须使用一些动作函数,如果有人能帮助我,我将不胜感激。
最适合初学者的方法是委托。当 Switch 单元检测到 .valueChanged
事件时,它应该将其转发给委托。代表依次更新其是否显示开关的模型,然后重新加载 tableView
.
这是一个游乐场示例:
import UIKit
import PlaygroundSupport
protocol SwitchDelegate: class {
func toggle(isOn: Bool)
}
class SwitchCell: UITableViewCell {
private lazy var switchControl: UISwitch = {
let switchControl = UISwitch()
contentView.addSubview(switchControl)
switchControl.translatesAutoresizingMaskIntoConstraints = false
switchControl.leadingAnchor.constraint(equalTo: contentView.leadingAnchor, constant: 12).isActive = true
switchControl.centerYAnchor.constraint(equalTo: contentView.centerYAnchor).isActive = true
switchControl.addTarget(self, action: #selector(toggleSwitch(_:)), for: .valueChanged)
return switchControl
}()
private weak var delegate: SwitchDelegate?
override func awakeFromNib() {
super.awakeFromNib()
}
func configure(isOn: Bool, delegate: SwitchDelegate) {
switchControl.isOn = isOn
self.delegate = delegate
}
@objc private func toggleSwitch(_ sender: UISwitch) {
delegate?.toggle(isOn: sender.isOn)
}
}
class ViewController: UITableViewController {
private let data = (0..<5).map { [=10=] + 1 }
private var isOn = true
override func viewDidLoad() {
super.viewDidLoad()
tableView.register(UITableViewCell.self, forCellReuseIdentifier: String(describing: UITableViewCell.self))
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count + (isOn ? 1 : 0)
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
if isOn && indexPath.row == 0 {
let switchCell = SwitchCell(style: .default, reuseIdentifier: String(describing: SwitchCell.self))
switchCell.configure(isOn: isOn, delegate: self)
return switchCell
} else {
let cell = tableView.dequeueReusableCell(withIdentifier: String(describing: UITableViewCell.self), for: indexPath)
let dataIndex = indexPath.row - (isOn ? 1 : 0)
cell.textLabel?.text = String(describing: data[dataIndex])
return cell
}
}
}
extension ViewController: SwitchDelegate {
func toggle(isOn: Bool) {
self.isOn = isOn
tableView.reloadData()
}
}
PlaygroundPage.current.liveView = ViewController()