2017-04-24 52 views
0

我必须从第一个控制器的菜单项点击来查看控制器,segue由'Present Modally'Segue执行,它将打开第二个viewController(充当菜单)当我按下第二个VC上的刷新按钮时,它从第一个VC调用该方法刷新其数据并将其加载到tableView上。问题在于它是从第二个VC调用方法到第一个VC,但是在这一行上返回nil。通过模态执行Segue后发现“发现零”异常

self.tableView.dataSource = self 

我认为这是因为第一个VC不活跃正确,因为它是在后台(第二VC的背景是透明的,这样我可以看到在后面的第一个VC)。我是新来的迅速,我不知道如何处理它。

编辑:这是刷新方法

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 1日呼吁完成的方法,仍然得到同样的错误。

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

    }) 
    // DayView_Controller().refresh() 

} 
+1

我们能看到一点点更多的代码。也许赛格会有帮助。也许是调用self.tableView.dataSource的整个刷新方法。 –

+0

一旦移动到另一个视图控制器,第一个视图控制器将被释放并且零。您无法从第二个VC中刷新第一个VC的数据。而不是你可以将数据从第二个VC传递到第一个VC。 –

+0

@RyanPoolos我已经通过故事板执行了segue。 –

回答

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

就是这样。你应该明白主意。

希望它可以帮助

+0

你能检查我的第二次编辑吗?我尝试了另一件事。 –

+0

@ShahtajKhalid从答案中实施我的建议。它像5分钟的编码。试试吧 –

+0

我试过了!它不调用dataChanged方法。 –

0

使用委派来刷新数据

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

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

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, RefreshDelegate { 

在您的赛格瑞方法设置的委托准备

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? 

现在称之为刷新代表从第二视图控制器

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

我试过了!刷新时点击它不刷新数据。 –

+0

如果您显示代码即您的刷新功能将会很有帮助。 – AkBombe

+0

它应该工作。我已经测试了这个解决方案,并且它正在工作。 – AkBombe