Как перезагрузить табличное представление с помощью контроллера представления (быстро)

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

У меня есть контроллер просмотра (а не контроллер таблицы) с табличным представлением в качестве подпредставления. Мой вопрос заключается в том, как перезагрузить данные таблицы внутри метода :viewwillappear контроллера представления. Внутри метода я не могу «получить доступ» к экземпляру tableview. (Также я понимаю, что не могу использовать reloaddata(), потому что я не использую tableviewcontroller).

Вы знаете какое-нибудь простое решение? (я очень предполагаю, что здесь может помочь протокол?)

это код вкратце:

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var Person_data = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let tb: UITableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)

        tb.dataSource = self
        tb.delegate = self
        super.view.addSubview(tb)

        fetch_data()
    }


        func tableView(tableview: UITableView, numberOfRowsInSection section: Int) -> Int {
            let rows = Person_data.count
            return rows
        }


       func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
        {  
            let cell: UITableViewCell = UITableViewCell()
            cell.textLabel?.text = Person_data[indexPath.row].name
            return cell
        }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        fetch_data()      
      // reload at this point

    } 


    func fetch_data() {

       let tb_fetchRequest = NSFetchRequest(entityName: "Person")
        do {

            let tb_fetchResults = try my_moc.executeFetchRequest(tb_fetchRequest) as? [Person]
            Person_data = tb_fetchResults!
        } catch let error as NSError {
                print("request error: \(error)")
            }

        }
    }

person Netzer    schedule 28.10.2015    source источник


Ответы (4)


Ваша проблема в том, что tb является локальной переменной, поэтому она не видна за пределами viewDidLoad().

Если вы сделаете tb свойством (также известным как переменная экземпляра) вашего контроллера представления, то вы сможете использовать его из любого метода контроллера:

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {

    var Person_data = [Person]()

    private var tb: UITableView?  // Now the scope of tb is all of ViewController3...

    override func viewDidLoad() {
        super.viewDidLoad()

        // ...so it is visible here...

        tb = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)

        ...
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        fetch_data()      

        tb?.reloadData()   // ...and it is also visible here.
    } 

Обратите внимание, что в вашем коде тот факт, что tb является локальной переменной, не означает, что ваш объект UITableView исчезнет после завершения viewDidLoad(). Это означает, что ваша ссылка на UITableView исчезает. Сам объект табличного представления живет, потому что он добавлен в вашу иерархию представлений, но у вас больше нет ссылки на него, потому что ваша переменная вышла из области видимости.

Чтобы узнать больше о различиях между переменными и объектами, на которые они ссылаются, выполните поиск по словам «область действия» и «передача по ссылке».

person Paul Cantrell    schedule 28.10.2015
comment
Спасибо за подсказку. Я более подробно рассмотрел переменные экземпляра - person Netzer; 30.10.2015
comment
Также взгляните на ответ @Arsen, который показывает, как вы можете запретить tableView быть необязательным и сразу инициализировать его. Этот метод часто не работает с элементами пользовательского интерфейса, но в данном случае он работает. - person Paul Cantrell; 30.10.2015
comment
Спасибо от Swift 4 в 2019 году! ???? - person Sylar; 15.01.2019

Вы можете получить доступ к своему tableView IBOutlet в viewWillAppear:, вы также можете позвонить reloadData. Я не уверен, почему вы думаете, что не можете, но это должно работать нормально.

person Charles A.    schedule 28.10.2015

Вы должны создать переменную со ссылкой на tableView и создать ее перед viewWillAppear.

class ViewController3: UIViewController, UITableViewDataSource, UITableViewDelegate {
    private let tableView = UITableView(frame: CGRect(x: 10, y: 50, width: 200, height:600), style: UITableViewStyle.Plain)
    var Person_data = [Person]()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.dataSource = self
        tableView.delegate = self
        super.view.addSubview(tb)

        fetch_data()
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        fetch_data()      
        tableView.reloadData()
    } 
}
person Arsen    schedule 28.10.2015

Перезагрузить tableView в Swift

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {

   //This is outlet of tableView...
 @IBOutlet public var userTableView : UITableView!

    override func viewDidLoad() {
        super.viewDidLoad()
        userTableView.delegate = self
        userTableView .datasource = self
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        fetchData()      
     
    }

 func fetchData(){
       //Here you can fetch your required data

       //Here the tableView will be reload...
        userTableView.reloadData()

 }
person Sambit Das    schedule 29.08.2020
comment
Используйте userTableView.reloadData() внутри функции fetchdata(). Вам нужно предоставить больше контекста/кода для fetchdata, чтобы любой мог ответить правильно. - person SriTeja Chilakamarri; 30.08.2020