2014-12-17 2 views
4

Я получаю ноль, когда пытаюсь установить делегат, и не могу понять, почему делегат неправильно настроен.iOS Delegate не устанавливается и возвращает nil (Swift)

У меня есть контроллер просмотра ListViewController, который я добавляю в подкатегорию, musicPlayer. musicPlayer - это UIView, у которого есть некоторые кнопки, которые должны активировать действия в ListViewController при нажатии.

musicPlayer устанавливается следующим образом:

protocol MusicPlayerControlsDelegate { 
    func playPauseClicked() 
} 


class musicPlayer: UIView { 

var myDelegate: MusicPlayerControlsDelegate? 

//this should trigger function in delegate 
@IBAction func playOrPause(sender: AnyObject) {  
    println(myDelegate?) 
    myDelegate?.playPauseClicked()   
} 

ListViewController устанавливается следующим образом:

class ListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, MusicPlayerControlsDelegate { 

var musicControls:musicPlayer = musicPlayer() 

override func viewDidLoad() { 
    musicControls.myDelegate = self 
} 

//adds musicPlayer nib as a subview to ListViewController 
@IBAction func playInApp(sender: AnyObject) { 

    let bundle = NSBundle(forClass: musicPlayer.self) 
    var playerSubview = bundle.loadNibNamed("musicPlayerSubview", owner: nil, options: nil)[0] as UIView 
    playerSubview.frame = CGRectMake(0, self.view.frame.width + 79, self.view.frame.width, 200) 

    self.view.addSubview(playerSubview) 
} 

func playPauseClicked() { 
    println("Your delegate is working") 
} 

Когда я запускаю это, println(myDelegate) является nil и println("Your delegate is working") никогда не вызывается. Любые предложения по устранению этого?

ответ

4

Если я правильно понял вашу установку, проблема заключается в том, что ваша настройка делегата на экземпляре musicPlayer (который действительно должен быть MusicPlayer с капиталом M), который никогда не отображается на экране - вы создаете этот экземпляр, но вы никогда что-нибудь с этим делать. Вы должны установить делегат на playerSubview, так как это экземпляр, который вы добавляете в качестве подзаголовка.

@IBAction func playInApp(sender: AnyObject) { 

    let bundle = NSBundle(forClass: musicPlayer.self) 
    var playerSubview = bundle.loadNibNamed("musicPlayerSubview", owner: nil, options: nil)[0] as musicPlayer 
    playerSubview.frame = CGRectMake(0, self.view.frame.width + 79, self.view.frame.width, 200) 
    playerSubview.myDelegate = self 
    self.view.addSubview(playerSubview) 
} 

Обратите внимание, что я изменил смиренные к «как MusicPlayer» вместо «в UIView», в противном случае компилятор будет жаловаться, когда вы пытаетесь установить делегат.

+0

совершенным - спасибо! – patkil

4

Иногда вы забыли SEGUE

if(segue.identifier == "YourSegueIdentifier"){ 
     let v = segue.destinationViewController as! YourViewController 

     v.delegate = self 

    } 

Эта линия имеет важное значение, потому что, если вы забыли его, то он не будет работать

v.delegate = self 
+0

Большое вам спасибо, я потратил много времени на действительно сложную проблему, и в конечном итоге это была недостающая вещь –

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