当您从其他View Controller进行搜索时,如何将数据从一个View Controller保存(追加)到另一个View Controller?

时间:2018-06-23 17:36:34

标签: ios swift

对不起,这个问题有点长。请忍受我。

基本上,我正在尝试使用swift编写一个简单的递增/递减ios应用程序。我有三个主要的视图控制器。一个是“初始视图控制器”(即根视图控制器),它仅包含两个按钮-一个以模态形式显示在实际计数页面上(第二个视图控制器),另一个以模态形式显示在tableViewController页面上(第三个视图控制器)。这就是三个视图控制器。

因此,如果用户选择保存他们一直在计数的计数器,那么我想将该计数器视图控制器上的数据附加到我创建的要在tableViewController上显示的数组中。因此,我使tableViewController成为Counter View Controller的委托,以将数据附加到数组。

据我了解,您需要在tableViewController中实现prepareSegue才能将tableViewController连接到Counter View Controller。但是,由于对Counter View Controller的选择不是源自tableViewController,而是源自Initial View Controller,因此prepareSegue函数不起作用,因此委托不起作用。因此,为了简化我的问题:当您从另一个视图控制器中选择数据时,如何将数据从一个视图控制器保存(追加)到另一个视图控制器?

我希望我的问题很清楚。我对软件开发是完全陌生的,不确定是否有意义。非常感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

如果故事板路径中有三个控制器,一个->两个->三个,而您想让一个知道三个中的数据更改,则需要通过两个传播更改。

一个粗略的版本可能看起来像这样:

protocol CountDelegate: class {
    func updateCount()
}

class One: UIViewController, CountDelegate {
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let destination = segue.destination as? Two else { return }
        destination.delegate = self
    }

    func updateCount() {
        // whatever
    }

}

class Two: UIViewController {
    weak var delegate: CountDelegate?
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let destination = segue.destination as? Three else { return }
        destination.delegate = self.delegate // just pass the delegate down
    }
}

class Three: UIViewController {
    weak var delegate: CountDelegate?

    func doWork() {
        self.delegate?.updateCount()
    }
}

所以委托是一个,并且两个和三个(通过两个)都指向它作为委托。

答案 1 :(得分:0)

解决方案1(使用通知):

每次在CounterViewController中更新计数器时,都需要执行以下代码:

let notification = Notification.init(name: NSNotification.Name(rawValue: "UpdateCounter"), object: NSNumber.init(value: 1), userInfo: nil)    

NotificationCenter.default.post(notification)

此代码在Initial View Controller中实现(以观察计数器的变化):

override func viewDidLoad() {
   super.viewDidLoad()
   NotificationCenter.default.addObserver(self, selector: #selector(parseNotification(_:)), name: NSNotification.Name.init(rawValue: "UpdateCounter"), object: nil)
}

func parseNotification(_ notification: Notification?) {
    if let number = notification?.object as? NSNumber {
        /** here counter is a class variable in Initial ViewController **/
        counter = number.intValue
    }
}

并在初始视图控制器的 prepareforSegue 中添加以下代码

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    //Condition to check if TableViewController is being opened
    tableViewController.counter = counter
}

不要忘记在初始视图控制器中删除观察者:

deinit {
    NotificationCenter.default.removeObserver(self)
}

解决方案2(使用全局/共享变量): 创建一个全局/共享变量,例如

class Shared {
    var value = 0
    let instance = Shared()
}

在CounterViewController中,每次计数器更新时都要设置值

Shared.instance.value = counterValue

您可以使用以下代码在TableViewController中读取值:

Shared.instance.value