发现没有'通过现在模态执行Segue之后的异常

时间:2017-04-24 10:48:19

标签: ios swift exception segue presentmodalviewcontroller

我必须查看控制器,从第一个控制器的菜单项单击开始,一个segue由' Present Modally'当我按下第二个VC上的刷新按钮时,会打开第二个viewController(充当菜单)的Segue,它从第一个VC调用方法刷新其数据并将其加载到tableView上。问题是从第二个VC到第一个VC调用方法,但在这一行返回nil。

    self.tableView.dataSource = self 

我认为这是因为第一个VC没有正常运行,因为它在后台(第二个VC的背景是透明的,所以我可以看到后面的第一个VC)。我是swift的新手,我不知道如何处理它。

编辑:这是刷新方法

   func refresh() {  

   //   self.dismiss(animated: true, completion: nil)
  //  present(DayView_Controller, animated: true, completion: nil)

   // self.dismiss(animated: true, completion: nil) // it is dismissing the first view controller instead of second



    ////////
    Extensions.ShowAlert(self.pwait, sender: self) // here it causing the exception on viewDidLoad
    let defaults = UserDefaults.standard
    let date = Date()
    let formatter = DateFormatter()
    formatter.dateFormat = "MM/d/yyyy"
    let finaldate = formatter.string(from:date)
    if Reachability.isConnectedToNetwork(){
    // all the services are being call and getting reloaded on tableview
  }

 override func viewDidLoad() {
    super.viewDidLoad()


    self.tableView.dataSource = self // exception here
  }

第二个EIDT:现在我在刷新点击时解雇了第二个VC,并在完成时从第一个VC调用该方法,仍然得到相同的错误。

 @IBAction func Refresh_CLick(_ sender: Any) {
    self.dismiss(animated: true, completion: {
        DayView_Controller().refresh()

    })
  //  DayView_Controller().refresh()

}

2 个答案:

答案 0 :(得分:0)

我相信,你需要做这样的事情:

1)创建协议:

protocol RefreshDelegate {
    func dataChanged(data: [Items])
}

2)在你的第二个视图控制器中添加:

var delegate: RefreshDelegate ?

if let del = delegate {
     del.dataChanged(data: items) // your refreshed data
}

3)在你的第一个视图控制器中添加扩展名:

extension FirstViewController: RefreshDelegate {
    func dataChanged(data: [Items]) {
         // update your tableView data -> then reload
    }
}

像这样的东西。你应该了解主要观点。

希望有所帮助

答案 1 :(得分:0)

使用委托刷新数据

protocol RefreshDelegate: class {
    func refreshData(data: Int)
}

在您的第一个视图控制器中添加委托

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, RefreshDelegate {

准备segue方法集委托

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "go" {
        let viewController:SecondViewController = segue.destination as! SecondViewController
        viewController.refreshDelegate = self
    }

}

// Delegate
    func refreshData(data: Int) {
        tableData = data
        self.tableView.reloadData()
    }

在第二个视图控制器中为委托添加变量

weak var refreshDelegate: RefreshDelegate?

现在从第二个视图控制器调用refresh delegate

@IBAction func refreshTapped(_ sender: UIButton) {
    self.dismiss(animated: true, completion: {
        self.refreshDelegate?.refreshData(data: 10)
    })
}