使用swift强制刷新另一个ViewController组件

时间:2016-09-07 07:10:17

标签: swift nsviewcontroller

我试图在2个视图控制器之间传递触发器,但我找不到有效的东西...

我的主控制器带有NSTableView,源链接,View Base。

主控制器类:

class ViewController: NSViewController {

我在全局变量中定义了一个数组。 在viewDidLoad上我在我的数组中添加了2个元素,然后我使用setDelegate和setDataSource。 它工作正常。

myLib.myCoins =  fillCoinsTable()
print ("My lib has \(myLib.myCoins.count) objects ")
mainCoinTable.setDelegate(self)
mainCoinTable.setDataSource(self)

我有一个从WINDOWS CONTROLLER到我的第二个视图Controller的segue。 (它是ToolBar按钮)。 segue是" Sheet"样。

第二个控制器允许我在全局变量数组中添加一个元素,并带一个按钮" Save"

第二个控制器上的代码

@IBAction func addCoinButton(sender: AnyObject) {

        //We add the coin
        let newCoin:coin = coin(n: textName.stringValue)
        newCoin.Year =  Int.init(textYear.stringValue)

        myLib.myCoins.append(newCoin)

        self.dismissController(self)

    }

如果我在主控制器上添加一个按钮,在TableView上重新加载数据,它可以正常工作。第三个元素被添加。

但我希望这是自动的......

我尝试了segue,但是我的不在视图控制器之间,而是在Windows控制器之间。

你能帮忙吗?

谢谢, 尼古拉斯

2 个答案:

答案 0 :(得分:3)

我认为,您想要从oneViewController添加数据而无需按下按钮,您想要在导航或按下后退按钮后,您想要自动重新加载tableview以显示更新的结果,对。

如果我没错,那么这个解决方案对你有用。

按照以下步骤操作:

第1步:

在视图控制器中添加此代码,您可以从中添加数组或数据库中的数据,而不是按钮单击。

 override func viewDidLoad()
        {
            super.viewDidLoad()
            let backItem = UIBarButtonItem(title: "Back", style: .Plain, target: self, action: "goBack")
            self.navigationItem.leftBarButtonItem = backItem
     }

     func goBack()
        {
        NSNotificationCenter.defaultCenter().postNotificationName("load", object: nil)
                 self.navigationController?.popViewControllerAnimated(true)
        }

第2步:

现在是最后一步。 现在将以下代码添加到结果视图控制器中,您希望自动更新结果。

 func loadList(notification: NSNotification){
        self.TableView.reloadData()
    }

 override func viewWillAppear(animated: Bool) {
       NSNotificationCenter.defaultCenter().addObserver(self, selector: "loadList:",name:"load", object: nil)

    }

现在在编码中实现这些代码。希望它适合你。

答案 1 :(得分:0)

如果您希望在显示视图时自动重新加载该表,请将其添加到viewWillAppear

self.tableView.performSelectorOnMainThread(#selector(UITableView.reloadData), withObject: nil, waitUntilDone: true)