iOS - UITableView внутри UIView - PullRequest
       1

iOS - UITableView внутри UIView

0 голосов
/ 04 марта 2019

Я хочу отобразить UITableView внутри UIViewController.Этот контроллер просмотра содержит UISegmentedControl с двумя экранами (FirstViewController и SecondViewController).

Первый контроллер просмотра - это тот, который содержит UIViewTable (пожалуйста, не обращайте внимания на второй).

Когда я запускаю приложение в симуляторе, все работает нормально, , но когда я пытаюсь прокрутить табличное представление в первом ViewController, ячейки исчезают .Единственный способ заставить их появиться снова - это убить приложение и открыть его снова.

Я новичок в разработке для iOS (я из Android), и я явно что-то здесь упускаю.

Я уже пытался добавить UIViewTable вне контейнера UIView, и он работает нормально.Поэтому я предполагаю, что проблема связана с контейнером или сегментированным элементом управления ...

Вот моя реализация:

  • Раскадровка

storyboard config UIViewController с UISegmentedControl и UIView (который будет содержать два экрана сегментированного элемента управления).

  • View Controller

    @IBOutlet weak var container: UIView!
    var sectionViews:[UIView]!
    
    override func viewDidLoad() {
         super.viewDidLoad()
    
         sectionViews = [UIView]()
         sectionViews.append(FirstViewController().view)
         sectionViews.append(SecondViewController().view)
         for v in sectionViews {
            container.addSubview(v)
         }
         container.bringSubviewToFront(sectionViews[0])
    }
    
    @IBAction func switchViewsAction(_ sender: UISegmentedControl) {
         self.container.bringSubviewToFront(self.sectionViews[sender.selectedSegmentIndex])
    }
    
  • First View Controller

В FirstViewController есть файлы swift и xibи содержит два файла Cell.swift и Cell.xib для ячейки таблицы.

FirstViewController.swift

@IBOutlet weak var tableView: UITableView!
let cellID = "CellId"

override func viewDidLoad() {
    super.viewDidLoad()

    self.tableView.register(UINib(nibName: "Cell", bundle: nil), forCellReuseIdentifier: cellID)
    self.tableView.dataSource = self
    self.tableView.delegate = self
}

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

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = self.tableView.dequeueReusableCell(withIdentifier: cellID, for: indexPath) as! Cell
    cell.label.text = "\(indexPath.row)"
    return cell
}

FirstViewController.xib

enter image description here

Cell.xib

enter image description here

Любая помощь будет оценена!Благодаря

Ответы [ 2 ]

0 голосов
/ 04 марта 2019
import UIKit

class TestViewController: UIViewController , UITableViewDataSource, UITableViewDelegate{

    @IBOutlet weak var segmentControlOutlet: UISegmentedControl!
    @IBOutlet weak var tableView: UITableView!
    var arrayName = ["Label1", "Label2", "Label3","Label4","Label5","Label6","Label7","Label8","Label9","Label10"]
    var arrayName2 =  ["Label1", "Label2", "Label3","Label4","Label5"]

    override func viewDidLoad() {
        super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    @IBAction func segmentControlAction(_ sender: UISegmentedControl) {
        self.tableView.reloadData()
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        if segmentControlOutlet.selectedSegmentIndex == 0 {
            return arrayName.count

        }else{
            return arrayName2.count

        }
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "TestTableViewCell", for: indexPath) as! TestTableViewCell
        if segmentControlOutlet.selectedSegmentIndex == 0 {
            cell.textLabel?.text = arrayName[indexPath.row]

        }else{
             cell.textLabel?.text = arrayName2[indexPath.row]
        }
        return cell
    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 50
    }
}

И этот код для класса UITableViewCell: -

import UIKit

class TestTableViewCell: UITableViewCell {
    @IBOutlet weak var labelName: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}

my table view

0 голосов
/ 04 марта 2019

Одна очевидная проблема заключается в том, что вы говорите container.addSubview(v) без указания v какого-либо кадра или ограничений.Так как вы используете autolayout для позиции container, вы должны также использовать autolayout для позиции v.Вы должны установить его верхний, нижний, ведущий и задний якоря равными container с constant, равным нулю.(И установите для translates... значение false.) Сделайте это для обоих случаев v в цикле.

Однако существует гораздо более серьезная проблема, заключающаяся в том, что созданные вами контроллеры представленияговоря, что FirstViewController() и SecondViewController() не сохраняются.Поэтому они исчезают в клубах дыма.Таким образом, они теряют свою функциональность;например, в табличном представлении больше нет источника данных или делегата, поэтому в нем нет ячеек.

То, что вы делаете, абсолютно незаконно.Вы не можете просто использовать контроллер представления, чтобы «погрузиться в мусорное ведро» как способ захватить его представление и толкнуть его, волей-неволей, в интерфейс.Вы должны сделать контроллер представления дочерним контроллером представления вашего родительского контроллера представления (в данном случае Item).Существует сложный танец, который вы должны выполнить, чтобы убедиться, что дочерний контроллер представления занимает свое надлежащее место в иерархии контроллера представления и принимает в хорошем порядке все сообщения, которые должен получить контроллер представления, а вы не исполняете танец.

Примеры того, как танцевать, см., Например, в моих ответах

и

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...