gpt4 book ai didi

ios - 根据 UISwitch 状态在我的主 ScrollView 上添加更多 tableView 作为 subview 仅在应用程序重新启动后才起作用

转载 作者:行者123 更新时间:2023-11-29 05:18:52 25 4
gpt4 key购买 nike

更新如下!

我有一个 UI 结构,其中水平 ScrollView 嵌套 5 个 TableView – 每个 TableView 代表一周中的一天。我添加了一个 UISwitch 以将周末添加到一周中,因此当用户打开它时,会向 ScrollView 添加另外两个 TableView subview 。到目前为止一切顺利,但开关更改仅在我重新启动应用程序时才会生效。看起来 ViewDidLoad() 使它发生,但除此之外什么也没有。我添加了一个名为 isWeekOn 的 Bool 变量。它的状态由 viewDidLoad 管理:

isWeekendOn =  UserDefaults.standard.bool(forKey: "switchState")
dayTableViews = fiveOrSevenDayTableViews()

其中 FiveOrSevenTableViews() 是一个闭包,返回具有正确计数的 TableView 数组,dayTableViews 是我的本地数组变量。

lazy var fiveOrSevenDayTableViews: () -> [DayTableView] = { 
if self.isWeekendOn == false {
return [self.mondayTableView, self.tuesdayTableview, self.wednesdayTableview, self.thursdayTableView, self.fridayTableView]
} else {
return [self.mondayTableView, self.tuesdayTableview, self.wednesdayTableview, self.thursdayTableView, self.fridayTableView, self.saturdayTableView,self.sundayTableView]
}
}

我向 isWeekendOn 添加了一个 didSet 属性观察器,它还调用 setupViews(),其中 TableView 的数量也通过调用 FiveOrSevenTableViews 闭包来决定。

var isWeekendOn: Bool = false {
didSet {
print("LessonVC IsWeekendon: ",isWeekendOn)
dayTableViews = fiveOrSevenDayTableViews()
setupViews()
print("didset daytableviews", fiveOrSevenDayTableViews().count)

}
}

我的 setupViews() 看起来像:

   func setupViews() {
setupScrollView()


let numberOfTableViews = CGFloat(dayTableViews.count)
let stackView = UIStackView(arrangedSubviews: fiveOrSevenDayTableViews())
print("setupViews stacview subviews count", stackView.arrangedSubviews.count)
stackView.axis = .horizontal
stackView.distribution = .fillEqually
scrollView.addSubview(stackView)
setupStackViewConstraints(stackView, numberOfTableViews)
}

和setupScrollView():

 private func setupScrollView() {
let numberOfTableViews = CGFloat(dayTableViews.count)
print("setupScrollview dableviews", numberOfTableViews)
scrollView.frame = CGRect(x: 0, y: 0, width: view.bounds.width, height:0)
scrollView.contentSize = CGSize(width: view.frame.width * numberOfTableViews, height: 0)
view.addSubview(scrollView)
setupScrollviewConstraints()
}

所有打印语句都被正确调用,所以我想知道为什么这些更改实际上没有实时生效,而是只能重新启动。

我尝试过的:

正如@maniponken建议的那样,我做了一个如下所示的函数:

func readdStackView(_ stackView: UIStackView) { stackView.removeFromSuperview() 

setupViews() }

我在 isWeekendOn didSet 观察者中调用它。不幸的是没有成功。

更新:

实际上,当我将任何东西放入 isWeekendon didSet 观察者时,都不起作用!例如,更改我的导航栏背景颜色...等一切都反射(reflect)在控制台上,在打印语句中!这些功能也仅在重新启动时生效。我不知道我做错了什么。

更新2:

使用本地 UIButton 删除表格没有任何问题!我的问题如下:我有一个设置 View Controller ,它有一个用于设置 5 或 7 个 TableView 的开关。实时更新不适用于该开关,只能使用本地按钮触发 @objc 函数。不过,我仍然需要用户的设置面板!

最佳答案

试试这个,它不是一个堆栈 View ,但它可以用于向 ViewController 添加(和删除) TableView 。此方法不使用 Storyboards

在你的 View Controller 中,包含表格 View

import Foundation
import UIKit

class SevenTableviews: UIViewController, UITableViewDelegate, UITableViewDataSource {

let tableView1: UITableView = {
let tv = UITableView()
tv.backgroundColor = .white
tv.separatorStyle = .none
return tv
}()

let tableView2: UITableView = {
let tv = UITableView()
tv.backgroundColor = .white
tv.separatorStyle = .none
return tv
}()

let tableSwitch: UISwitch = {
let switchBtn = UISwitch()
switchBtn.addTarget(self, action: #selector(switchTables), for: .touchUpInside)
return switchBtn
}()

var isTableTwoShowing = false

let reuseIdentifier = "DaysCell"
var days = ["monday", "tuesday", "wednesday", "thursday", "friday"]
var weekendDays = ["saturday", "sunday"]


override func viewDidLoad() {
super.viewDidLoad()

setupTableview()
}

func setupTableview() {
tableView1.dataSource = self
tableView1.delegate = self
tableView1.register(DaysTableviewCell.self, forCellReuseIdentifier: reuseIdentifier)
view.addSubview(tableView1)
tableView1.anchor(top: view.safeAreaLayoutGuide.topAnchor, left: view.leftAnchor, bottom: view.centerYAnchor, right: view.rightAnchor)

if isTableTwoShowing == true {
tableView2.dataSource = self
tableView2.delegate = self
tableView2.register(DaysTableviewCell.self, forCellReuseIdentifier: reuseIdentifier)
view.addSubview(tableView2)
tableView2.anchor(top: view.centerYAnchor, left: view.leftAnchor, bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.rightAnchor)
}

view.addSubview(tableSwitch)
tableSwitch.anchor(bottom: view.safeAreaLayoutGuide.bottomAnchor, right: view.rightAnchor, paddingBottom: 24, paddingRight: 12)


}

@objc func switchTables() {

if tableSwitch.isOn {
isTableTwoShowing = true
setupTableview()
} else {
isTableTwoShowing = false
tableView2.removeFromSuperview()
}
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
if tableView == tableView1 {
return days.count
} else if tableView == tableView2 {
return weekendDays.count
} else {
return 0
}

}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier) as! DaysTableviewCell

if tableView == tableView1 {
cell.dateLabel.text = days[indexPath.row]
return cell
} else {
cell.dateLabel.text = weekendDays[indexPath.row]
return cell
}

}
}

在你的tableviewCell类中:

import Foundation
import UIKit

class DaysTableviewCell: UITableViewCell {

let identifier = "DaysCell"

let cellContainer: UIView = {
let view = UIView()
view.backgroundColor = .white
view.backgroundColor = Colors.boxBack
view.setCellShadow()
return view
}()

let dateLabel: UILabel = {
let label = UILabel()
label.font = UIFont.systemFont(ofSize: 20)
return label
}()

override init(style: UITableViewCell.CellStyle, reuseIdentifier: String?) {
super.init(style: style, reuseIdentifier: reuseIdentifier)
setupViews()
}

func setupViews() {

selectionStyle = .none

addSubview(cellContainer)
cellContainer.anchor(top: topAnchor, left: leftAnchor, bottom: bottomAnchor, right: rightAnchor, paddingTop: 4, paddingLeft: 8, paddingBottom: 4, paddingRight: 8, height: 35)

cellContainer.addSubview(dateLabel)
dateLabel.anchor(top: cellContainer.topAnchor, left: cellContainer.leftAnchor, bottom: cellContainer.bottomAnchor, right: cellContainer.rightAnchor, paddingTop: 4, paddingLeft: 8, paddingBottom: 4, paddingRight: 8)
}

required init?(coder aDecoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

}

我对两个表格 View 使用相同的单元格类,但您可以自己决定如何执行此操作。

此外,我的约束是使用我从教程中找到的扩展设置的:


extension UIView {

func anchor(top: NSLayoutYAxisAnchor? = nil, left: NSLayoutXAxisAnchor? = nil, bottom: NSLayoutYAxisAnchor? = nil, right: NSLayoutXAxisAnchor? = nil, paddingTop: CGFloat? = 0, paddingLeft: CGFloat? = 0, paddingBottom: CGFloat? = 0, paddingRight: CGFloat? = 0, width: CGFloat? = nil, height: CGFloat? = nil) {

translatesAutoresizingMaskIntoConstraints = false

if let top = top {
topAnchor.constraint(equalTo: top, constant: paddingTop!).isActive = true
}

if let left = left {
leftAnchor.constraint(equalTo: left, constant: paddingLeft!).isActive = true
}

if let bottom = bottom {
if let paddingBottom = paddingBottom {
bottomAnchor.constraint(equalTo: bottom, constant: -paddingBottom).isActive = true
}
}

if let right = right {
if let paddingRight = paddingRight {
rightAnchor.constraint(equalTo: right, constant: -paddingRight).isActive = true
}
}

if let width = width {
widthAnchor.constraint(equalToConstant: width).isActive = true
}

if let height = height {
heightAnchor.constraint(equalToConstant: height).isActive = true
}
}

}

希望对你有帮助

关于ios - 根据 UISwitch 状态在我的主 ScrollView 上添加更多 tableView 作为 subview 仅在应用程序重新启动后才起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58877180/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com