2015-04-09 3 views
0

я управляемый объект, определенный:Как передать NSManagedObject через протокол/делегат?

@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 может отправить объект игры в VCB следующим образом:

var gameDelegate: gameProtocol! 
gameDelegate.gameFunction(myInitializedAndSavedGameObject) 

Все это работает, но мне нужно переменную уровня класса внутри ViewControllerB, чтобы можно было записать другой код в зависимости от игры. Это, конечно, не работает:

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

Я не знаю, правильные слова для него, но я думаю, что я хочу инициализацию, пустой объект игры. Полагаю, я мог бы написать удобную инициализацию, которая делает временную игру, но это не похоже на хорошую идею.

Мое текущее обходное решение - иметь NSManagedObjectID(), а затем воссоздать объект из идентификатора. Но это много повторяющегося кода, чтобы получить объект, который является центральным для того, с чем этот ViewController предназначен для работы.

+1

Почему у вас нет переменной экземпляра? – Wain

+0

Потому что я не знаю, что это (любитель-самоучка). Но ваше предложение побудило меня обнаружить «ленивый var currentGame = Game()», который, похоже, я хочу. Делая var lazy, назначенный инициализатор никогда не называется неправильно. Я уверен, что первое, что нужно коснуться var, будет методом gameFunction, поэтому мой другой код будет компилироваться без сбоев. Благодаря! – wellspokenman

ответ

2

Итак, вы хотите направить свой NSManagedObject на свой второй контроллер просмотра? - Вам не нужен делегат, вы можете отправить свой объект как переменную экземпляра, как уже сказал Уэйн.

Для примера (в вашем 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? 
    } 
    } 

} 

// инициализировать Second View Controller (например, при использовании перетекает)

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

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

Таким образом, вы можете использовать ваш NSManagedObject в вашем SecondViewController - если вы хотите оттолкнуть его, вы можете использовать делегат.

+0

О, я вижу сейчас. поэтому «var currentGame: Game!» является переменной экземпляра? Думал, я это пробовал, но ты прав. Мне не хватало! - однако мне нужен делегат, потому что мои VC завернуты в навигацию по навигации, поэтому они не переходят друг к другу напрямую. Не хотел усложнять вопрос. – wellspokenman

+0

Хорошо - но это не проблема передачи переменной через делегат. Если у вас есть вопросы, не стесняйтесь спрашивать. – derdida

+0

Теперь он работает, но я не знаю, почему переменная экземпляра должна быть прервана символом '!' , Без ! объявление переменной экземпляра типа «var myVar: myType» выдает ошибку компилятора, говоря, что мой класс ViewController не имеет назначенного инициализатора. Внутри стандартных определений объектов это не проблема, это происходит только тогда, когда я пишу внутри класса VC. Любая идея почему? – wellspokenman

0

'lazy var currentGame = Game()' похоже, что я хочу. Делая var lazy, назначенный инициализатор никогда не называется неправильно. Я уверен, что первое, что нужно коснуться var, будет методом gameFunction, поэтому мой другой код будет компилироваться, и он не будет разбиваться во время выполнения. Альтернативные предложения приветствуются.

+0

'var currentGame: Game!' это ответ на мой вопрос. Спасибо, ребята, – wellspokenman

Смежные вопросы