未设置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
非常感谢你,我花了很多时间在一个非常复杂的问题上,最终这就是我遗漏的东西