我有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中提交
答案 0 :(得分:2)
您可以使用NSNotification
执行此操作 swift 3.0中的
认为您有两个名为df.columns = pd.to_datetime(df.columns)
和viewcontrollerA
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()