2015-03-14 3 views
0

Я пытаюсь использовать протокол/делегат в swift, и пока я не получаю никаких ошибок, кажется, что мой делегат не создается. Он возвращает мне ноль, и я не уверен, почему.Протокол делегата не работает, возвращает nil

Вот мой код

Класс 1

import UIKit 

protocol GameViewSliding{ 
    func slideGameView() 
} 

class GameDetailsViewController: UIViewController { 
var delegate:GameViewSliding? 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view. 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

@IBAction func showOptions(sender: AnyObject) { 

    println("button pressed") 
    println(delegate) 
    delegate?.slideGameView() 
} 

}

Class 2, что соответствует протоколу

import UIKit 

var currentHoleNumber:Int = 0 
var parThree = false; 
var parFive = false; 

class GameViewController: UIViewController, GameViewSliding{ 


var gameDetailsVC:GameDetailsViewController = GameDetailsViewController() 
override func viewDidLoad() { 
    super.viewDidLoad() 

    println("inside the game class") 
    gameDetailsVC.delegate = self 
} 

func slideGameView(){ 
    println("this is from the root controller") 
} 

}

ответ

1

Проблема в том, как в коде, который вы не видите здесь. В prepareForSegue вы обычно хотите установить делегат на контроллер представления назначения.

По существу вы устанавливаете его на экземпляр класса, который вы создаете, но это не тот экземпляр, который на самом деле отображается. Таким образом, экземпляр, который показан, не имеет делегата.

Удалите локальный var второго контроллера, и настройка делегата в представлении загрузилась и просто установила его в пункте назначения, чтобы подготовиться к segue, и я уверен, что он будет работать отлично.

+0

Существует не segue. У меня есть контроллер представления и внутри, что у меня есть два контроллера контейнера. Я хочу, чтобы контроллер корневого представления мог перемещать 2 вида контейнера, поэтому я думаю, что когда я нажимаю кнопку в контроллере контейнера 1, я могу использовать протокол и слушать это нажатие в корневом контроллере, а затем иметь корень контроллер делает эту анимацию контроллеров контейнеров. – icekomo

+1

Тогда вам придется подключить его, когда вы представите два подзаголовка. Проблема по-прежнему заключается в том, что экземпляр, который вы объявляете во втором контроллере представления, не является экземпляром, который в настоящее время отображается. Таким образом, корневой контейнер, когда он представляет собой обработчики subview (тем не менее), должен передать делегат в этой точке на подпрограммы. Имеют смысл? – Tim

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