2015-03-13 4 views
0

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

Вот мой код

Класс 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") 
    } 

} 

Делегат возвращается ноль, поэтому я никогда не получаю Println от Class2, просто не знаю, почему это ноль.

ответ

1

Вы должны установить ссылку на Ваш GameViewController к классу GameDetailsViewController, когда он должен быть представлен и установить его delegate следующим образом:

gameDetailsViewController.delegate = self 

И что делегат это не nil, конечно, что установите ссылку в prepareForSegue или любой другой метод, который вы используете для представления другого ViewController.

+0

Я обновил свой код, и сделал ссылку на GameDetailsVC, но когда println для делегата запущен внутри функции showOptions, я все равно получаю nil – icekomo

+3

@icekomo hi! решил ли решить эту проблему? – Harris

1

Я заметил, что есть некоторые проблемы при настройке делегата при использовании SplitViewController. DetailVC из splitViewController можно получить следующим образом:

override func viewDidLoad() { 
    super.viewDidLoad() 
    let detailNavigationController = splitViewController?.viewControllers[1] as! UINavigationController 
    let detailVC = detailNavigationController.topViewController as! DetailViewController 

    detailVC.delegate = self 
} 

Другой способ установить делегат в AppDelegate, строки, следующие после SplitViewController сконфигурировано:

let masterNavigationController = splitViewController.viewControllers[0] as! UINavigationController 
let masterVC = masterNavigationController.topViewController as! MasterViewController 
let detailNavigationController = splitViewController.viewControllers[1] as! UINavigationController 
let detailVC = detailNavigationController.topViewController as! DetailViewController 

detailVC.delegate = masterVC 
Смежные вопросы