未设置iOS委托并返回nil(Swift)

未设置iOS委托并返回nil(Swift),ios,swift,Ios,Swift,当我试图设置一个委托时,我得到了零,并且无法理解为什么该委托没有正确设置 我有一个视图控制器ListViewController,我在其中添加了一个子视图,musicPlayerMusicLayer是一个UIView,它有一些按钮,当单击时应触发ListViewController中的操作 musicPlayer的设置如下: protocol MusicPlayerControlsDelegate { func playPauseClicked() } class musicPlay

当我试图设置一个委托时,我得到了零,并且无法理解为什么该委托没有正确设置

我有一个视图控制器
ListViewController
,我在其中添加了一个子视图,
musicPlayer
MusicLayer
是一个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()        
}
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")
}
ListViewController
的设置如下:

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()        
}
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(“您的委托正在工作”)
从未被调用。关于如何解决这个问题有什么建议吗?

如果我正确理解您的设置,问题是您在一个从未出现在屏幕上的MusicLayer实例(实际上应该是带大写字母M的MusicLayer)上设置代理--您创建了该实例,但从未对其执行任何操作。您应该在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)
}

请注意,我将downcast改为“as musicPlayer”而不是“as UIView”,否则当您尝试设置委托时,编译器会抱怨。

有时,您忘记了segue

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

        v.delegate =  self

    }
这句话很重要,因为如果你忘了它,它就不起作用了

v.delegate = self

非常感谢你,我花了很多时间在一个非常复杂的问题上,最终这就是我遗漏的东西