与代表传递数据

Passing Data with Delegates

我很难理解与代表传递的数据,我看过但我对答案感到困惑,因为我通常试图做与我需要做的相反的事情。

我想做的是将一个 PFObject 从我的主 viewController(一个 UITableView)传递到一个 PopOverViewController。

我已经成功完成了,但是我需要传递对象。从 mainController (SOITableViewController) 传递到 popover (DetailPopViewController) 的最佳方式是什么?

协议应该去哪里? Delegate方法应该放在哪里等等

谢谢!

执行此操作的最佳方法是在执行 prepare for segue 方法时传递它。所以要做到这一点,请在您的 detailPopViewController 中创建一个变量。在这种情况下,故事板中的 pop over segue 将具有 segue 标识符 detailView。 tblSearchResults 也是您的 tableView 出口(您可以随意命名)。这就是您要找的吗?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    if segue.identifier == "detailView" {
        if let  detailViewController = segue.destinationViewController as? PopOverViewController{
            if let indexPath = self.tblSearchResults.indexPathForCell(sender as! SOITTableViewController) {

                detailViewController.objectInSecondVC = objectFromFirstVC[indexPath.row]

            }

        }
    }
}

PrepareForSegue、NSUserDefault 和 Singleton

根据您希望如何处理数据,您有几个可能的选项可以将数据传递到其他视图,我会为您解释每一个,您可以选择最适合您需要的选项。


prepareForSegue: Method

如果您想为 1 个 segue 转换保留数据,我推荐此方法,这是将此再次传递给另一个视图的一个很好的理由,之后您需要在新视图中创建另一个 prepareForSegue。这是一个关于如何做到这一点的例子:

首先,您在两个视图中创建 2 个变量,1 个用于发送 (currentViewController.swift),1 个用于接收 (toViewyourGoingController.swift)。

currentViewController.swift var dataToSend: AnyObject?
ViewYourGoingController.swift var dataToReceive: AnyObject?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {

    //Check your segue, this way you can transfer different data to different view. also make sure the identifier match your segue.
    if segue.identifier == "toViewYourGoing" {

        //Initial your second view data control
        let ExchangeViewData = segue.destinationViewController as! toViewyourGoingController
        
        //Send your data with segue 
        ExchangeViewData.dataToReceive = dataToSend
    }
}

NSUserDefault

现在,如果您希望在安装该应用程序时保持数据有效,则此方法非常有用,一旦删除该应用程序,该方法就会自动重置。如果您愿意,您还可以选择更新密钥的值,这是 NSUserDefault 的操作方法:

我总是喜欢将我的 NSUserDeafult 注册为默认设置,很多人只是继续第二步而不注册。

在AppDelgate.swift

中注册NSUserDefault
NSUserDefaults.standardUserDefaults().registerDefaults(["valueName": AnyObject])

将 Value 设置为您的 NSUserDefault,这取决于您存储的数据类型,如果您确实注册了,应该与您的注册相匹配。 (下面的布尔数据类型示例)

NSUserDefaults.standardUserDefaults().setBool(true, forKey: "valueName") //Bool Data Type

确保在将值设置为 NSUserDefault 后同步,这样它会立即更新,否则会在有机会时更新。

NSUserDefaults.standardUserDefaults().synchronize()

接收值:这将接收布尔值,因为我们设置了布尔值并注册了布尔值。

let Variable: Bool! = NSUserDefaults.standardUserDefaults().boolForKey("valueName")

单例

现在单例基本上是一个全局变量,你可以在任何视图中使用它们,但有些开发人员会遇到一些错误和困难,使用它需要你自担风险,我建议你确定要使用时使用这种方法数据很多(仍然有风险),但这种方法就像数据处理女神 :)。

创建一个NSObject子类并命名为DataManager.swift(我称它为数据管理器是因为它处理数据。)如下:

导入 UIKit

class DataManager: NSObject {
        
   //Store Data Globally
   static var someData: Boo! //This Boolean, you can choose whatever you want.
}

static 让您的数据保持活跃。

现在您可以像处理任何数据类型一样从任何地方存储和接收 someData

//Store
DataManager.someData = true

//Receive 
print(DataManager.someData)

挑战:

您也可以使用

Keychain Sergey Kargopolov 将带您了解如何通过第三方使用 swift 钥匙串。否则,您甚至可以 harder challenge 自己创建一个 :P .

Key-Value Data in iCloud