根据 UISwitch 状态在我的主滚动视图上添加更多 tableView 作为子视图仅在应用程序重新启动后才有效

Adding more tableViews as subview on my main scrollView depending on a UISwitch state works only after application relaunches

更新如下!

我有一个 UI 结构,水平滚动视图嵌套了 5 个 table 视图——每个代表一周中的一天。我已经添加了一个 UI 开关来将周末添加到一周中,因此当用户打开它时,另外两个 tableview-subviews 被添加到 scrollView。到目前为止一切顺利,但开关更改仅在我重新启动应用程序时生效。看起来 ViewDidLoad() 让它发生了,但没有别的。我添加了一个名为 isWeekOn 的 Bool 变量。它的状态由 viewDidLoad 管理:

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

其中 fiveOrSevenTableViews() 是一个闭包,它返回具有正确计数的 table 视图数组,而 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(),其中 tableviews 的数量也由调用 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 观察者中调用它要多。不幸的是没有成功。

更新:

实际上,当我将 anything 放入我的 isWeekendon didSet 观察器时,不起作用!例如改变我的 navigationBar backgroundColor...等一切都反映在控制台上,在打印语句中!这些功能在重新启动时也会生效 only.I 不知道我做错了什么。

更新 2:

删除 tables 可以毫无问题地使用本地 UIButton!不过,我的问题如下:我有一个设置视图控制器,它有一个用于设置 5 或 7 table 视图的开关。实时更新不适用于该开关,仅适用于 le 本地按钮,触发 @objc 函数。不过,我仍然需要用户的设置面板!

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

在您的 viewcontroller 中,包含表格视图

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-class:

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")
    }

}

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

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


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
        }
    }

}

希望对您有所帮助

夫妇注意事项:

  • 每次更改开关时,您都不需要重新创建/重新添加堆栈视图。添加它在 viewDidLoad() 然后添加/删除 "DayTableViews"
  • 在滚动视图中对堆栈视图使用约束,而不是计算 .contentSize
  • 可能想使用您的 "Day Tables" 的数组而不是使用单独的 mondayTableViewtuesdayTableView 等...变量。

这是您可以使用的示例。我使用了一个带有居中标签的简单 UIView 作为模拟 "DayTableView" - 应该很清楚。一切都是通过代码 - 没有 @IBOutlet@IBAction - 所以要测试这个,创建一个新项目,添加这段代码,并将启动视图控制器分配给 AddToScrollViewController:

//
//  AddToScrollViewController.swift
//
//  Created by Don Mag on 11/15/19.
//

import UIKit

class DayTableView: UIView {

    // simple UIView with a centered label
    // this is just simulatig a UITableView

    let theLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.textAlignment = .center
        v.backgroundColor = .yellow
        return v
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }

    func commonInit() -> Void {

        addSubview(theLabel)

        NSLayoutConstraint.activate([
            theLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
            theLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
        ])

    }

}

class AddToScrollViewController: UIViewController {

    let theSwitch: UISwitch = {
        let v = UISwitch()
        return v
    }()

    let scrollView: UIScrollView = {
        let v = UIScrollView()
        v.backgroundColor = .orange
        return v
    }()

    let stackView: UIStackView = {
        let v = UIStackView()
        v.axis = .horizontal
        v.distribution = .fillEqually
        v.spacing = 16
        return v
    }()

    let mondayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Monday"
        return v
    }()

    let tuesdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Tuesday"
        return v
    }()

    let wednesdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Wednesday"
        return v
    }()

    let thursdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Thursday"
        return v
    }()

    let fridayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Friday"
        return v
    }()

    let saturdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Saturday"
        return v
    }()

    let sundayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Sunday"
        return v
    }()

    var dayTableViews: [DayTableView] = [DayTableView]()

    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]
        }
    }

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

        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // for each of these views...
        [theSwitch, scrollView, stackView].forEach {
            // we're going to use auto-layout
            [=10=].translatesAutoresizingMaskIntoConstraints = false
        }

        // for each of these views...
        [mondayTableView, tuesdayTableView, wednesdayTableView, thursdayTableView, fridayTableView, saturdayTableView, sundayTableView].forEach {
            // we're going to use auto-layout
            [=10=].translatesAutoresizingMaskIntoConstraints = false
            // constrain widths to 160 (change to desired table view widths)
            [=10=].widthAnchor.constraint(equalToConstant: 160.0).isActive = true
            // give them a background color so we can see them
            [=10=].backgroundColor = .systemBlue
        }

        // add the (empty) stack view to the scroll view
        scrollView.addSubview(stackView)

        // add the switch to the view
        view.addSubview(theSwitch)

        // add the scroll view to the view
        view.addSubview(scrollView)

        // use safe area for view elements
        let g = view.safeAreaLayoutGuide

        // we need to constrain the scroll view contents (the stack view, in this case)
        // to the contentLayoutGuide so auto-layout can handle the content sizing
        let sg = scrollView.contentLayoutGuide

        NSLayoutConstraint.activate([

            // put switch in top-left corner
            theSwitch.topAnchor.constraint(equalTo: g.topAnchor, constant: 12.0),
            theSwitch.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 12.0),

            // constrain scroll view 12-pts below the switch
            // and leading / trailing / bottom at Zero
            scrollView.topAnchor.constraint(equalTo: theSwitch.bottomAnchor, constant: 12.0),
            scrollView.bottomAnchor.constraint(equalTo: g.bottomAnchor),
            scrollView.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            scrollView.trailingAnchor.constraint(equalTo: g.trailingAnchor),

            // constrain the stack view to the scroll view's contentLayoutGuide
            // with 8-pts padding on each side (easier to see the framing)
            stackView.topAnchor.constraint(equalTo: sg.topAnchor, constant: 8.0),
            stackView.bottomAnchor.constraint(equalTo: sg.bottomAnchor, constant: -8.0),
            stackView.leadingAnchor.constraint(equalTo: sg.leadingAnchor, constant: 8.0),
            stackView.trailingAnchor.constraint(equalTo: sg.trailingAnchor, constant: -8.0),

            // constrain height of stack view to height of scroll view frame,
            // minus 16-pts (for 8-pt padding)
            stackView.heightAnchor.constraint(equalTo: scrollView.heightAnchor, constant: -16),

        ])

        // add a target for the switch
        theSwitch.addTarget(self, action: #selector(switchChanged(_:)), for: .valueChanged)

        // set based on saved state in UserDefaults
        isWeekendOn = UserDefaults.standard.bool(forKey: "switchState")

    }


    @objc func switchChanged(_ sender: Any) {
        // switch was tapped (toggled on/off)
        if let v = sender as? UISwitch {
            // update state in UserDefaults
            UserDefaults.standard.set(v.isOn, forKey: "switchState")
            // update the UI
            isWeekendOn = v.isOn
        }
    }

    func setupViews() {

        // first, remove any existing table views
        stackView.arrangedSubviews.forEach {
            [=10=].removeFromSuperview()
        }

        // get the array of 5 or 7 table views
        let a = fiveOrSevenDayTableViews()

        // add the table views to the stack view
        a.forEach {
            stackView.addArrangedSubview([=10=])
        }

        print("setupViews stacview subviews count", stackView.arrangedSubviews.count)

    }

}

在 "weekend switch" 关闭的情况下向右滚动:

打开 "weekend switch" 后立即向右滚动:


编辑

这是一种略有不同(更有效)的方法。无需添加/删除 table 视图,只需显示/隐藏星期六和星期日 table 即可。堆栈视图将自动处理滚动视图的内容大小。

完整更新示例:

//
//  AddToScrollViewController.swift
//
//  Created by Don Mag on 11/15/19.
//

import UIKit

class DayTableView: UIView {

    // simple UIView with a centered label
    // this is just simulatig a UITableView

    let theLabel: UILabel = {
        let v = UILabel()
        v.translatesAutoresizingMaskIntoConstraints = false
        v.textAlignment = .center
        v.backgroundColor = .yellow
        return v
    }()

    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }

    required init?(coder: NSCoder) {
        super.init(coder: coder)
        commonInit()
    }

    func commonInit() -> Void {

        addSubview(theLabel)

        NSLayoutConstraint.activate([
            theLabel.centerXAnchor.constraint(equalTo: centerXAnchor),
            theLabel.centerYAnchor.constraint(equalTo: centerYAnchor),
        ])

    }

}

class AddToScrollViewController: UIViewController {

    let theSwitch: UISwitch = {
        let v = UISwitch()
        return v
    }()

    let scrollView: UIScrollView = {
        let v = UIScrollView()
        v.backgroundColor = .orange
        return v
    }()

    let stackView: UIStackView = {
        let v = UIStackView()
        v.axis = .horizontal
        v.distribution = .fillEqually
        v.spacing = 16
        return v
    }()

    let mondayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Monday"
        return v
    }()

    let tuesdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Tuesday"
        return v
    }()

    let wednesdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Wednesday"
        return v
    }()

    let thursdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Thursday"
        return v
    }()

    let fridayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Friday"
        return v
    }()

    let saturdayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Saturday"
        return v
    }()

    let sundayTableView: DayTableView = {
        let v = DayTableView()
        v.theLabel.text = "Sunday"
        return v
    }()

    var isWeekendOn: Bool = false {
        didSet {
            print("LessonVC IsWeekendon: ",isWeekendOn)
            setupViews()
        }
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        // for each of these views...
        [theSwitch, scrollView, stackView].forEach {
            // we're going to use auto-layout
            [=11=].translatesAutoresizingMaskIntoConstraints = false
        }

        // for each of these views...
        [mondayTableView, tuesdayTableView, wednesdayTableView, thursdayTableView, fridayTableView, saturdayTableView, sundayTableView].forEach {
            // we're going to use auto-layout
            [=11=].translatesAutoresizingMaskIntoConstraints = false
            // constrain widths to 160 (change to desired table view widths)
            [=11=].widthAnchor.constraint(equalToConstant: 160.0).isActive = true
            // give them a background color so we can see them
            [=11=].backgroundColor = .systemBlue
            // add them to the stack view
            stackView.addArrangedSubview([=11=])
        }

        // add the stack view to the scroll view
        scrollView.addSubview(stackView)

        // add the switch to the view
        view.addSubview(theSwitch)

        // add the scroll view to the view
        view.addSubview(scrollView)

        // use safe area for view elements
        let g = view.safeAreaLayoutGuide

        // we need to constrain the scroll view contents (the stack view, in this case)
        // to the contentLayoutGuide so auto-layout can handle the content sizing
        let sg = scrollView.contentLayoutGuide

        NSLayoutConstraint.activate([

            // put switch in top-left corner
            theSwitch.topAnchor.constraint(equalTo: g.topAnchor, constant: 12.0),
            theSwitch.leadingAnchor.constraint(equalTo: g.leadingAnchor, constant: 12.0),

            // constrain scroll view 12-pts below the switch
            // and leading / trailing / bottom at Zero
            scrollView.topAnchor.constraint(equalTo: theSwitch.bottomAnchor, constant: 12.0),
            scrollView.bottomAnchor.constraint(equalTo: g.bottomAnchor),
            scrollView.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            scrollView.trailingAnchor.constraint(equalTo: g.trailingAnchor),

            // constrain the stack view to the scroll view's contentLayoutGuide
            // with 8-pts padding on each side (easier to see the framing)
            stackView.topAnchor.constraint(equalTo: sg.topAnchor, constant: 8.0),
            stackView.bottomAnchor.constraint(equalTo: sg.bottomAnchor, constant: -8.0),
            stackView.leadingAnchor.constraint(equalTo: sg.leadingAnchor, constant: 8.0),
            stackView.trailingAnchor.constraint(equalTo: sg.trailingAnchor, constant: -8.0),

            // constrain height of stack view to height of scroll view frame,
            // minus 16-pts (for 8-pt padding)
            stackView.heightAnchor.constraint(equalTo: scrollView.heightAnchor, constant: -16),

        ])

        // add a target for the switch
        theSwitch.addTarget(self, action: #selector(switchChanged(_:)), for: .valueChanged)

        // set based on saved state in UserDefaults
        isWeekendOn = UserDefaults.standard.bool(forKey: "switchState")

        // update the switch UI
        theSwitch.isOn = isWeekendOn

    }


    @objc func switchChanged(_ sender: Any) {
        // switch was tapped (toggled on/off)
        if let v = sender as? UISwitch {
            // update state in UserDefaults
            UserDefaults.standard.set(v.isOn, forKey: "switchState")
            // update the UI
            isWeekendOn = v.isOn
        }
    }

    func setupViews() {

        // show or hide Sat and Sun table views
        saturdayTableView.isHidden = !isWeekendOn
        sundayTableView.isHidden = !isWeekendOn

    }

}

你为什么不做一个水平的集合视图而不是普通的滚动视图。每当你想添加或删除一个单元格时调用 reloadData 会更容易(当然每个单元格都是一个 tableView)

终于解决了这个问题。

更新:我必须为此设置 NotificationCenter 的主要原因是我使用 UITabBarController 将设置 VC 添加到我的应用程序而不是模态显示。详情如下。

//跳过这部分以获得答案 我的主要问题——事实证明——是我的 UISwitch 在一个单独的 vc 上,叫做 SettingsViewController。 这个开关应该在我的 main vc 上进行 tableview 的添加和删除。我尝试使用委托协议,针对设置的共享实例VC,没有任何效果,但为此添加了一个本地按钮——这绝对不是我想要的。 然后我读到了 NotificationCenter! 我记得它来自 Apples App Development For Swift 一本书,我去年读过,但从那以后就忘记了。 // 所以答案

根据@DonMag 的提示正确设置约束后,我为我的 SettingsViewController 设置了 NotificationCenter,发布到我的 Main VC.

class SettingsViewController: UITableViewController {

   private let reuseID = "reuseId"

    lazy var switchButton: UISwitch = {
        let sw = UISwitch()
        sw.addTarget(self, action: #selector(switchPressed), for: .valueChanged)
        sw.onTintColor = AdaptiveColors.navigationBarColor
        return sw
    }()

    static let switchNotification = Notification.Name("SettingsController.switchNotification")

    var isOn = Bool() {
        didSet {


NotificationCenter.default.post(name:SettingsViewController.switchNotification, object: nil)
    }
}
 @objc func switchPressed(_ sender: UISwitch) {
    UserDefaults.standard.set(sender.isOn, forKey: "switchState")
    self.isOn = sender.isOn   
}

然后在主要VC:

    override func viewDidLoad() {
        super.viewDidLoad()
        scrollView.delegate = self

        view.backgroundColor = .white

        isWeekendOn = UserDefaults.standard.bool(forKey: "switchState")
// The Solution:
        NotificationCenter.default.addObserver(self, selector: #selector(handleRefresh), name: SettingsViewController.switchNotification, object: nil)

        dayTableViews = fiveOrSevenDayTableViews()
        print("daytableviews count ", dayTableViews.count)
        scrollView.delegate = self

        editButtonItem.title = LocalizedString.edit
        navigationItem.title = localizedDays[currentPage]

        setupNavigationBar()
        setupButtons()
        setupTableViews()
        setupViews()
        isWeekendOn == true ? setupCurrentDayViewFor_7days() : setupCurrentDayViewFor_5days()

    }

然后在主要 VC 的 @objc func handleRefresh() { } 中,我正在处理删除或添加!

更新:

在设置中VC:

     static let switchOnNotification = Notification.Name("SettingsController.switchOnNotification")
   static let switchOffNotification = Notification.Name("SettingsController.switchOffNotification")

    var isOn = Bool() {
        didSet {

        }
        willSet {
            if newValue == true {
                NotificationCenter.default.post(name:SettingsViewController.switchOnNotification, object: nil)
            } else if newValue == false {
                NotificationCenter.default.post(name:SettingsViewController.switchOffNotification, object: nil)
            }
        }
    }

在 mainVC 中的 viewDidLoad 中:

NotificationCenter.default.addObserver(self, selector: #selector(handleAddWeekendTableViews), name: SettingsViewController.switchOnNotification, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(handleRemoveWeekendTableViews), name: SettingsViewController.switchOffNotification, object: nil)





@objc func handleAddWeekendTableViews() {

        [saturdayTableView, sundayTableView].forEach {
            stackView.addArrangedSubview([=13=])
            dayTableViews.append([=13=])
    }
}

@objc func handleRemoveWeekendTableViews() {
   manageCurrentPage()
    dayTableViews.removeLast(2)
    [saturdayTableView, sundayTableView].forEach {
        [=13=].removeFromSuperview()
          }

}

这个确实有效!