2016-12-30 78 views
0

我有2个控制器A和控制器B.控制器A有一个TableView,而控制器B是一个子视图,点击时打开一个表单,并在提交时将数据输入到数据库中。我的问题是,我试图从点击提交用户重装我的TableView来自控制器B的,我得到以下错误 致命错误:意外地发现零,而从该行IOS Swift如何从另一个控制器重新加载tableView

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请求,从数据库中同一控制AI获取数据,现在有一个按钮,当点击打开子视图控制器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对照中奥勒一个

@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的TableView从形式在控制器B提交

+2

正在创建ControllerA(实例Submit_Form),这是怎么回事像与你最初的东西完全不同。我认为你需要重新审视类和类的实例之间的差异,以及它与在故事板中创建的视图控制器的关系。 * IF *控制器B确实是一个控制器,您可以简单地刷新控制器A中viewDidAppear中的数据,当表单被解散时将调用它。但在我看来,控制器B可能不是一个控制器,并且你不正确地描述它(因为你说“控制器B是一个子视图”) – Gruntcakes

+1

换句话说,你应该如何设计这个设计的正确解决方案,直到你精确地显示你调用的控制器B是什么,以及它是如何从控制器A中调用的。作为一个方面的评论 - 在视图控制器中拥有你的http获取代码,并且总是被重新调用,这不是一个好主意。您可能需要考虑将其移至模型类。 – Gruntcakes

+0

噢,好的,谢谢我将首先处理这个问题,并将我的Http代码移动到模型类中,因为我仍然在学习正确的方式来快速完成任务。 – user1949387

回答

2

您可以用NSNotification

做SWIFT 3.0

想你有两个viwe控制器称为viewcontrollerAviewControllerB

  • viewcontrollerA有实现代码如下。
  • 你需要从viewcontrollerA

    viewcontrolerB

implementaion重新加载它创建一个函数来relod你的tableview在viewcontrollerA并调用它viewDidLoad在viewcontrollerB

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() 
} 

实施(你想重新加载tableview的地方)

发布通知in button click or anywhere you want like below

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

希望这将有助于你。

1

我会建议使用协议:

protocol SomeActionDelegate { 
    func didSomeAction() 
} 

在ViewController中乙

var delegate: SomeActionDelegate? 

在视图控制器一当赛格瑞

viewControllerB.delegate = self 

你应该添加此

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

而且在ViewController中乙

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

它工作时的ViewController乙didChangeSomething()它发送消息的ViewController一个,它应该didSomeAction()

相关问题