IOS Swift, как я могу перезагрузить tableView с другого контроллера

У меня есть 2 контроллера A и контроллер B. Контроллер A имеет TableView, а контроллер B - это подвид, который при нажатии открывает форму и при отправке вводит данные в базу данных. Моя проблема заключается в том, что я пытаюсь перезагрузить свой TableView из контроллера B, когда пользователь нажимает кнопку отправки, и я получаю следующую ошибку фатальная ошибка: неожиданно найдено nil при развертывании необязательного значения из этой строки.

 self.TableSource.reloadData()

Теперь данные из контроллера B успешно вставлены, поэтому после перезапуска приложения данные, которые я отправляю, есть. Это мой код (TableSource - выход TableView)

Контроллер А

  func reloadTable(latmin: Float,latmax: Float,lonmin: Float, lonmax: Float) {
        let url:URL = URL(string:ConnectionString+"MY-URL")!



        let session = URLSession.shared
        var request = URLRequest(url: url)
        request.httpMethod = "POST"
        request.cachePolicy = NSURLRequest.CachePolicy.reloadIgnoringCacheData
        let parameter = "parameters"
        request.httpBody = parameter.data(using: String.Encoding.utf8)
        session.dataTask(with:request, completionHandler: {(data, response, error) in
            if error != nil {

            } else {
                do {

                    let parsed = try JSONSerialization.jsonObject(with: data!, options: .allowFragments) as! [String:Any]



                    if let S = parsedData["myData"] as? [AnyObject]            {


                        for A in Data {
                           // gets Json Data

                                       }

                        DispatchQueue.main.async {
                    // This is what I named my TableView
                            self.TableSource.reloadData()

                        }
                    }

                } catch let error as NSError {
                    print(error)
                }

            }

        }).resume()


    }

Это мой HTTP-запрос, который получает данные из базы данных, теперь в том же контроллере A у меня есть кнопка, которая при нажатии открывает SubView для контроллера B, и это код

  @IBAction func Post_Action(_ sender: Any) {
        let Popup = UIStoryboard(name: "Main", bundle: nil).instantiateViewController(withIdentifier: "ControllerB") as! Controller B

        self.addChildViewController(Popup)
        Popup.view.frame = self.view.frame
        self.view.addSubview(Popup.view)
        Popup.didMove(toParentViewController: self)
    }

Это код в контроллере B, и вот как я пытаюсь перезагрузить TableView в контроллере A.

@IBAction func Submit_Form(_ sender: Any) {

  // Code that submits the form no issues here


        latmin = 32.18
       latmax = 32.50
       lonmin = -81.12
       lonmax = -81.90

     let Homepage = ControllerA()
       Homepage.reloadTable(latmin: latmin!,latmax: latmax!,lonmin: lonmin!,lonmax: lonmax!)

    }

Итак, как было сказано ранее, контроллер A загружает данные из базы данных, контроллер B имеет форму и при отправке вводит новые данные в базу данных. Весь этот процесс работает. Я только сейчас хочу обновить TableView в контроллере A из формы, представленной в контроллере B.


person user1949387    schedule 30.12.2016    source источник
comment
В Submit_Form вы создаете экземпляр ControllerA(), это будет совершенно другой экземпляр, чем у вас изначально. Я думаю, вам нужно рассмотреть разницу между классом и экземпляром класса и то, как это связано с контроллерами представления, создаваемыми в раскадровках. ЕСЛИ контроллер B действительно является контроллером, вы можете просто обновить данные в контроллере A в viewDidAppear, который будет вызываться при закрытии формы. Однако мне кажется, что контроллер B может не быть контроллером, и вы неправильно его описываете (потому что вы говорите, что контроллер B является подвидом)   -  person Gruntcakes    schedule 30.12.2016
comment
Другими словами, правильное решение о том, как вы должны спроектировать это, не может быть дано, пока вы точно не покажете, что вы называете контроллером B и как он вызывается из контроллера A. В качестве побочного комментария - ваш код извлечения http в самом контроллере представления , и постоянно перезванивать - не очень хорошая идея. Возможно, вы захотите переместить его в класс модели.   -  person Gruntcakes    schedule 30.12.2016
comment
О, хорошо, спасибо, я сначала поработаю над этим и перенесу свой Http-код в класс модели, так как я все еще изучаю правильный способ делать что-то в swift.   -  person user1949387    schedule 31.12.2016
comment
вы можете сделать это с nsnotifications   -  person Chanaka Anuradh Caldera    schedule 31.12.2016


Ответы (2)


Я бы предложил использовать протокол:

protocol SomeActionDelegate {
    func didSomeAction()
}

В ViewController B

var delegate: SomeActionDelegate?

В ViewController A при переходе

viewControllerB.delegate = self

Вы должны добавить это

extension ViewControllerA: SomeActionDelegate {
    func didSomeAction() {
         self.tableView.reloadData()
    }
}

И в ViewController B

 func didChangeSomething() {
      self.delegate?.didSomeAction()
 }

Это работает так же, как когда ViewController B didChangeSomething() отправляет сообщение ViewController A, что он должен didSomeAction()

person JuicyFruit    schedule 31.12.2016

Вы можете сделать это с помощью NSNotification

в Swift 3.0

Предположим, у вас есть два контроллера viwe с именами viewcontrollerA и viewControllerB.

  • viewcontrollerA имеет табличное представление.
  • вам нужно перезагрузить его с viewcontrolerB

реализация viewcontrollerA

создайте функцию для изменения таблицы в viewcontrollerA и вызовите ее в viewDidLoad

override func viewDidLoad() {
    let notificationNme = NSNotification.Name("NotificationIdf")
    NotificationCenter.default.addObserver(self, selector: #selector(YourControllername.reloadTableview), name: notificationNme, object: nil)
}

func relodaTableview() {
    self.TableSource.reloadData()
}

реализация в viewcontrollerB (где вы хотите перезагрузить табличное представление)

опубликовать уведомление in button click or anywhere you want like below

 let notificationNme = NSNotification.Name("NotificationIdf")
 NotificationCenter.default.post(name: notificationNme, object: nil)

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

person Chanaka Anuradh Caldera    schedule 31.12.2016