【问题标题】:How to pass data when the back button clicked?单击后退按钮时如何传递数据?
【发布时间】:2016-05-26 22:30:38
【问题描述】:

我正在尝试将数据从UITableview 传递到另一个UITableview,当我按下cell 时,我成功传递了数据,但是当我按下导航栏的后退按钮时,我无法将数据传回;我已经尝试使用全局变量来解决这个问题,但是由于我将这些变量的日期存储在数据库中,这给我带来了很多问题,因为它强制所有存储的提醒来保存相同的数据,我可以做一些技巧来解决这个问题,但我们都知道全局变量是不好的做法,并且不确认OOP 也不确认MVC,问题是如何使用Prepare for segue 函数将数据传回;请注意,表格视图是静态的而不是动态的。

如果您询问了我正在尝试通过的数据是一周中的数据,那么当周五和周六被选中时,它会将返回真值发送到上一个视图,如果日星期五和周六取消选择假值,则会发送错误值以前的观点

那么我该如何解决这个问题呢?

提前致谢

【问题讨论】:

  • 当您点击返回按钮时,会调用委托方法viewWillDisapear()。实现它并在这个方法中传回数据
  • 究竟如何,抱歉,我对 iOS 开发有点陌生,我知道一旦该视图消失,viewWillDisapear() 将被执行,但这里的问题是如何准确地传回数据跨度>
  • 我会告诉你,给我一分钟

标签: ios swift uitableview segue


【解决方案1】:

你需要做四件事:

首先

您应该有一个自定义协议,例如:

public protocol DataBackDelegate: class {
    func savePreferences (preferencesRestaurantsArray : [Bool], preferencesCusinesArray : [Bool])
}

如您所见,我假设您想要发回两个数组,但您可以对其进行编辑以发送您想要的任何数据和数据类型。

第二

您的第一个视图控制器(或表视图控制器,因为表视图控制器只是视图控制器的子类)必须符合您的自定义协议,例如:

class MainTableViewController: UITableViewController, DataBackDelegate  

第三

在您的第二个视图控制器中,您需要为该协议提供一个变量,例如:

 weak var delegate: DataBackDelegate?

然后您捕获 back 动作并在其中调用您的自定义协议函数,例如:

self.delegate?.savePreferences(Preferences2ViewController.preferencesRestaurantsArray, preferencesCusinesArray: Preferences2ViewController.preferencesCusinesArray)

第四

在您的第一个主控制器中,在触发第二个视图控制器的 segue 中,您应该将 deleage 设置为 self,例如:

destination.dataBackDelegate = self

destination 是第二个视图控制器

【讨论】:

    【解决方案2】:

    我没有实现表格视图,我只是向您展示了这个概念。

    VIEWCONTROLLER A(第一个 UITableView):

    import UIKit
    
    class vc1: UIViewController {
    
    //Just to store days and the selected state (at start they should be unselected I presume)
    
    var selectedDays : [String : Bool] = [
        "Monday":false,
        "Tuesday":false,
        "Wednesday":false,
        "Thursday":false,
        "Friday":false,
        "Saturday":false,
        "Sunday": false
    ]
    
    override func viewDidLoad() {
        super.viewDidLoad()
    
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    
        //set this current view controller to the other UIViewController which will be pushed (vc2)
        //You will need it later when pass back data
        let secondViewController = segue.destinationViewController as! vc2
        secondViewController.previousVC = self
    }
    

    }

    VIEWCONTROLLER B(您的第二个 UITableView):

    class vc2: UIViewController {
    
    
    var previousVC : ViewController
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(true)
    
        //Suppose that I selected the day of monday and the day thursday
        //get the datasource from the previousVC UIViewController and set the correct selected days
        previousVC.selectedDays["monday"] = true
        previousVC.selectedDays["thursday"] = true
    
        //Here your previousVC selectedDays dictionary variable contains now the new values 
        //So you can do all you want with it when you will come back on your previous viewcontroller
    
        /*
         var selectedDays : [String : Bool] = [
         "Monday":true,
         "Tuesday":false,
         "Wednesday":false,
         "Thursday":true,
         "Friday":false,
         "Saturday":false,
         "Sunday": false
         ]
         */
    }
    

    }

    这是你想要的吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-16
      • 2019-11-16
      • 1970-01-01
      • 2021-12-27
      • 1970-01-01
      相关资源
      最近更新 更多