Swift - использование делегирования для отображения на tableView - PullRequest
1 голос
/ 14 февраля 2020

В попытке научиться использовать делегата в Swift. Проблема в том, что я использовал делегат для добавления строкового значения (от pickCourse() до ViewController()) к sampleArr; однако, он, кажется, добавляется, но не отображается в табличном представлении ViewController(). Я пытался использовать viewWillAppear, но мне не повезло. Кто-нибудь знает, как я могу заставить sampleArr появляться в табличном представлении ViewController() после того, как я выбрал значение someString в pickCourses(), которое автоматически возвращается к ViewController()?

import UIKit

class ViewController: UITableViewController, testingDelegate {

    let cellId = "Something"

    var sampleArr : [String] = []

    func sendDataback(data: String) {
        sampleArr.append(data)
        tableView.reloadData()
    }
    override func viewWillAppear(_ animated: Bool) {
        tableView.reloadData()
    }

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)

        navigationItem.title = "Testing Delegate??"
        navigationController?.navigationBar.prefersLargeTitles = true

        self.view.backgroundColor = UIColor.white

        let button1 = UIBarButtonItem(title: "Add A String", style: .plain, target: self, action: #selector(addTapped))
        self.navigationItem.rightBarButtonItem = button1

    }

    @objc func addTapped(sender: UIBarButtonItem!) {

        let destination = PickCourses()
        destination.delegate = self
        navigationController?.pushViewController(destination, animated: true)
    }

}
import UIKit

protocol testingDelegate {
    func sendDataback(data: String)
}

class PickCourses: UITableViewController {

    var delegate: testingDelegate?

    let cellId = "leariningtopassdata"

    let someString = [
        "One One One One",
        "Two Two Two Two",
        "Three Three Three Three",
        "Four Four Four",
        "Five Five Five"
    ]

    override func viewDidLoad() {
        super.viewDidLoad()

        navigationItem.title = "Pick Some String"
        navigationController?.navigationBar.prefersLargeTitles = true

        tableView.register(UITableViewCell.self, forCellReuseIdentifier: cellId)
        tableView.delegate = self
        tableView.dataSource = self

        self.tableView.tableFooterView = UIView() //removes extra line in UITableView

        tableView.isScrollEnabled = false //disables scrolling
    }

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return someString.count
        }
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)

        let stringlabel = self.someString[indexPath.row]
        cell.textLabel?.text = stringlabel

        return cell
    }

    let vc = ViewController()

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){

        tableView.deselectRow(at: indexPath, animated: true)
        let data = someString[indexPath.row]
        delegate?.sendDataback(data: data)
        self.navigationController?.popViewController(animated: true)
    }


}

Ответы [ 2 ]

3 голосов
/ 14 февраля 2020

Вы должны прочитать UITableViewController :

Вы также должны переопределить источник данных и методы делегирования, необходимые для заполнения таблицы данными.

Я не могу найти, где вы переопределяете методы источника данных во ViewController. Вы сделали это только в PickCourses.

1 голос
/ 14 февраля 2020

Вы должны вставить следующее в ваше объявление calss:

class YourClassName: UIViewController, UITableViewDataSource, UITableViewDelegate {

Это предложит вам добавить методы делегата, которые следующие:

cellForRowAt, numbersOfSection, numbersOfRowInSection, 

После реализации всех их вы можете внедрить что-то вроде этого в метод cellForRow:

let cell = tableView.dequeueReusableCell(withIdentifier: cellId, for: indexPath)
    cell.textLabel?.text = sampleArr![indexPath.row]
    return cell

Надеюсь, это поможет.

...