【问题标题】:Setting a default child table view controller for segmented control为分段控制设置默认子表视图控制器
【发布时间】:2018-07-26 03:59:36
【问题描述】:

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

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

这是表格视图控制器的代码:

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

【问题讨论】:

  • 您是否以编程方式设置 TableView?如果是这样,您是否设置了约束?此外,请确保设置 tableViews 数据源和委托(通常为自己)。

标签: ios swift


【解决方案1】:

因为BarNewestViewControllerUITableViewController 的子类,它会自动遵循UITableViewDataSourceUITableViewDelegate 协议,例如tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int。但是它不会告诉UITableViewController 附带的属性tableView 它是delegatedataSourceBarNewestViewController

tableView.dataSource = self
tableView.delegate = self

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多