如何通过protocol / delegate传递NSManagedObject?

时间:2015-04-09 12:29:26

标签: ios swift

我定义了一个托管对象:

@objc (Game)
class Game: NSManagedObject {
  @NSManaged var player1: Player
  @NSManaged var player2: Player
  @NSManaged var totalScore: NSNumber
  @NSManaged var gameDate: NSDate
}

我从ViewControllerA初始化它,然后使用委托模式将它提供给ViewControllerB。该协议如下所示:

protocol gameProtocol {
    func gameFunction(input: Game)
}

ViewControllerB注册协议:

class ViewControllerB: UIViewController, gameProtocol {...}

并实现此功能以符合:

func gameFunction(input: Game) {
    let currentGame = input
}

然后ViewControllerA可以将一个Game对象发送到VCB,如下所示:

var gameDelegate: gameProtocol!
gameDelegate.gameFunction(myInitializedAndSavedGameObject)

这一切都有效,但我需要ViewControllerB中的类级变量,以便可以编写其他代码来依赖游戏。当然,这不起作用:

var currentGame = Game()
func gameFunction(input: Game) {
    currentGame = input
}

我不知道它的正确用语,但我想我想要一个初始化的空Game对象。我想我可以编写一个方便的初始化游戏,但这看起来不是一个好主意。

我目前的解决方法是使用NSManagedObjectID(),然后从ID重新创建对象。但是这是一个重复的代码来获取一个对象,这个对象是ViewController设计使用的核心。

2 个答案:

答案 0 :(得分:2)

所以你想把你的NSManagedObject推送到你的第二个视图控制器? - 你不需要一个委托,你可以把你的对象作为实例变量发送,就像Wain已经说过的那样。

例如(在你的MainViewController中)

class MainViewControntroller: UIViewController {
    var currentGameObject:YOURNSMANAGEDOBJECT!

    func viewDidLoad() {
        // load your Object
       var fetchRequest = NSFetchRequest(entityName: "Game")
     .....
     games = context.executeFetchRequest(fetchRequest, error: nil) as [YOURNSMANAGEDOBJECT]

    if(games.count > 0) {
        // set to any game object (here is only the last) 
        currentGameObject = games.last?
    }  
   }

}

//初始化第二个视图控制器(例如使用segues时)

if(segue.identifier == "yourIdentifierInStoryboard") {

    var yourNextViewController = (segue.destinationViewController as yourNextViewControllerClass)
    yourNextViewController.currentGameObject = currentGameObject

因此,您可以在SecondViewController中使用NSManagedObject - 如果要将其推回,则可以使用委托。

答案 1 :(得分:0)

'懒惰的var currentGame = Game()'似乎就是我想要的。通过使var延迟,指定的初始化程序永远不会被错误地调用。我确信触摸var的第一件事就是gameFunction方法,所以我的其他代码将编译并且它不会在运行时崩溃。欢迎另类建议。