IOS Swift如何从不同的控制器

时间:2016-12-30 20:31:51

标签: ios swift uitableview swift3

我有2个控制器A和控制器B.控制器A有一个TableView,而控制器B是一个子视图,点击它时打开一个表单,然后在提交时将数据输入数据库。我的问题是我尝试从用户命中提交从控制器B重新加载我的TableView,我得到以下错误 致命错误:从此行解包“可选值”时意外发现nil

 self.TableSource.reloadData()

现在控制器B中的数据已成功插入,因此在我重新启动应用程序后,我提交的数据就在那里。这是我的代码(TableSource是TableView插座)

控制器A

  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-Request,现在在同一个控制器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 中的代码,这就是我尝试在Controller A中重新加载TableView的方法

@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有一个表单,并在提交时将新数据输入数据库。整个过程工作我刚刚想要在控制器A中更新表格中的表格在控制器B中提交

2 个答案:

答案 0 :(得分:2)

您可以使用NSNotification

执行此操作 swift 3.0中的

认为您有两个名为df.columns = pd.to_datetime(df.columns) viewcontrollerA

的viwe控制器
  • viewControllerB有桌面视图。
  • 您需要从viewcontrollerA
  • 重新加载

实现viewcontrollerA

创建一个函数来重新设置viewcontrolerB中的tableview并在viewcontrollerA中调用它

viewDidLoad
viewcontrollerB中的

实现(您要重新加载tableview)

发布通知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() }

in button click or anywhere you want like below

希望这会对您有所帮助。

答案 1 :(得分:2)

我建议使用协议:

protocol SomeActionDelegate {
    func didSomeAction()
}

在ViewController B中

var delegate: SomeActionDelegate?

在ViewController A中当segue

viewControllerB.delegate = self

你应该添加这个

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

在ViewController B中

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

它的作用就像ViewController B didChangeSomething()向ViewController A发送消息它didSomeAction()