IOS Swift如何从另一个控制器重新加载tableView
我有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提交
您可以用NSNotification
做SWIFT 3.0
想你有两个viwe控制器称为viewcontrollerA
和viewControllerB
-
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)
希望这将有助于你。
我会建议使用协议:
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()
正在创建ControllerA(实例Submit_Form),这是怎么回事像与你最初的东西完全不同。我认为你需要重新审视类和类的实例之间的差异,以及它与在故事板中创建的视图控制器的关系。 * IF *控制器B确实是一个控制器,您可以简单地刷新控制器A中viewDidAppear中的数据,当表单被解散时将调用它。但在我看来,控制器B可能不是一个控制器,并且你不正确地描述它(因为你说“控制器B是一个子视图”) – Gruntcakes
换句话说,你应该如何设计这个设计的正确解决方案,直到你精确地显示你调用的控制器B是什么,以及它是如何从控制器A中调用的。作为一个方面的评论 - 在视图控制器中拥有你的http获取代码,并且总是被重新调用,这不是一个好主意。您可能需要考虑将其移至模型类。 – Gruntcakes
噢,好的,谢谢我将首先处理这个问题,并将我的Http代码移动到模型类中,因为我仍然在学习正确的方式来快速完成任务。 – user1949387