ios - 设置分段控制的默认子 TableView Controller

标签 ios swift

我可以使用分段控件在容器 View 内的子 TableView Controller 之间切换,但当我由于某种原因进入场景时,它不会显示第一个 TableView Controller 的单元格。我的段索引默认为 0,因此它显示第一个段上的突出显示,但它不会相应地显示单元格。 这是segmentedControl和容器 View 的代码:

import UIKit

class BarMainViewController: UIViewController {

let barSegmentedControl: UISegmentedControl = {
    let barItems = ["Newest", "Rewarding", "Saved"]
   let segmentedControl = UISegmentedControl(items: barItems)
    segmentedControl.selectedSegmentIndex = 0
    segmentedControl.addTarget(self, action: #selector(selectionDidChange(_:)), for: .valueChanged)

    return segmentedControl
}()

let containerView: UIView = {
   let view = UIView()
    view.translatesAutoresizingMaskIntoConstraints = false

    return view
}()

override func viewDidLoad() {
    super.viewDidLoad()

    view.addSubview(barSegmentedControl)
    view.addSubview(containerView)

    setDefaultVC()

    barSegmentedControl.addUnderlineForSelectedSegment()

    containerView.topAnchor.constraint(equalTo: barSegmentedControl.bottomAnchor).isActive = true
    containerView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -49).isActive = true
    containerView.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
    containerView.widthAnchor.constraint(equalTo: view.widthAnchor).isActive = true

}

@objc func selectionDidChange(_ sender: UISegmentedControl) {
    updateView()
    barSegmentedControl.changeUnderlinePosition()
}

private func updateView() {
    if barSegmentedControl.selectedSegmentIndex == 0 {
        remove(asChildViewController: BarRewardingViewController())
        remove(asChildViewController: BarSavedViewController())
        add(asChildViewController: BarNewestViewController())
    } else if barSegmentedControl.selectedSegmentIndex == 1 {
        remove(asChildViewController: BarNewestViewController())
        remove(asChildViewController: BarSavedViewController())
        add(asChildViewController: BarRewardingViewController())
    } else {
        remove(asChildViewController: BarNewestViewController())
        remove(asChildViewController: BarRewardingViewController())
        add(asChildViewController: BarSavedViewController())
    }
}

private func add(asChildViewController viewController: UITableViewController) {
    // Add Child View Controller
    addChildViewController(viewController)

    // Add Child View as Subview
    containerView.addSubview(viewController.view)

    // Configure Child View
    viewController.view.translatesAutoresizingMaskIntoConstraints = false

    // Notify Child View Controller
    viewController.didMove(toParentViewController: self)
}

private func remove(asChildViewController viewController: UITableViewController) {
    // Notify Child View Controller
    viewController.willMove(toParentViewController: nil)

    // Remove Child View From Superview
    viewController.view.removeFromSuperview()

    // Notify Child View Controller
    viewController.removeFromParentViewController()
}

private func setDefaultVC() {
    containerView.addSubview(BarNewestViewController().view)
}
}

这是 TableView Controller 的代码:

import UIKit

class BarNewestViewController: UITableViewController {

override func viewDidLoad() {

    tableView.register(serviceCell.self, forCellReuseIdentifier: "service")

    super.viewDidLoad()

    view.backgroundColor = mainBlue
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 5
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    return tableView.dequeueReusableCell(withIdentifier: "service", for: indexPath)
}
}

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

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

let nameLabel: UILabel = {
   let label = UILabel()
    label.text = "NAME"
    label.font = UIFont(name: "Avnier-Heavy", size: 20)

    label.translatesAutoresizingMaskIntoConstraints = false
    return label
}()

func setupViews() {
    addSubview(nameLabel)
    backgroundColor = lightBlue

    nameLabel.topAnchor.constraint(equalTo: topAnchor).isActive = true
    nameLabel.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
}    
}

最佳答案

因为 BarNewestViewControllerUITableViewController 的子类,它会自动遵循 UITableViewDataSourceUITableViewDelegate 协议(protocol),例如tableView(_ tableView: UITableView, numberOfRowsInSection 部分: Int) -> Int。然而,它并没有告诉 UITableViewController 附带的属性 tableView 它是 delegate 并且 dataSourceBarNewestViewController .

tableView.dataSource = self
tableView.delegate = self

关于ios - 设置分段控制的默认子 TableView Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51530788/

相关文章:

ios - 在 iOS 8 中每次启动时记录或缓存路径更改

iphone - 自动旋转和 UIImageView 动画的问题

xcode - 我可以将我的项目代码导入到 Swift REPL 中吗?

swift - 如何使用自定义对象填充 TableView ?

ios - 关于从照片应用程序中删除重复照片的应用程序

ios - 如何使用 Phonegap Build 删除 iOS 状态栏?

ios - 如何在快速单击按钮时更改开关状态

swift - MKPolyline 标注

swift - 如何在 MKAnnotation CalloutAccessoryView 中显示所选图像,swift 2.2

ios - 用于 firebase 信使 Swift 的 UITableViewCell