2016-02-19 39 views
1

我有两个观点:在UIViews之间进行委托 - 在哪里放置接收者的委托?

  1. 委派视图中,带有“发送”按钮按下时调用通过委托

  2. 接收视图带有标签的的sendMessage。收到sendMessage后,标签应该改变。

出于某种原因,我无法让他们“连接”。我怀疑它与接收方代理的设置有关(通常情况下,当发件人的代表为零时,就像在这种情况下那样)。但是把它放在哪里?我已经搜索了网络,书籍等这个答案,虽然偶尔会问,但它从来没有回答。我在这里错过了什么?

似乎与“receiver.delegate = self”行有关。

这里有两个UIViews:

发送:

import UIKit 

protocol DelegatingViewDelegate { 
func sendMessage() 
} 

class DelegatingView: UIView { 

var delegate: DelegatingViewDelegate? 


init() { 

    super.init(frame: CGRect(x: 0, y: 0, width: 200, height: 100)) 
} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
} 

@IBOutlet weak var delegatingLabel :UILabel? 

@IBAction func sendButton(sender: AnyObject) { 
    print(delegate) 
    delegate?.sendMessage() 
    print("Sending message") 

} 

} 

接收:

import UIKit 

class ReceivingView: UIView, DelegatingViewDelegate { 

var receiver = DelegatingView() 

init() { 

    super.init(frame: CGRect(x: 0, y: 0, width: 200, height: 100)) 
    receiver.delegate = self 

} 

required init(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder)! 
} 

override func awakeFromNib() { 
    // 
} 

@IBOutlet weak var receiveingLabel :UILabel? 

func sendMessage() { 


    receiveingLabel?.text = "GOT IT" 
    print("Received message") 
} 

} 
+0

您不会在任何设置代表的地方显示。您必须在视图控制器中执行此操作。事实上,它可能是视图控制器应该是委托,它应该更新文本字段。 – Paulw11

+0

好吧,我可以委托给视图控制器,并通过在视图控制器中设置委托来设置视图的文本字段。但这是间接的沟通,并不是我想要的。我不能让两种观点相互“交谈”吗?这是否违反了MVC?我认为代表团是解决这些问题的方法。为什么不receiver.delegate =自我工作(显然不) –

+1

你在做什么是违反MVC。您所面临的挑战是委托人需要参考委托人才能将自己设置为委托人。现在你的视图控制器将引用两个项目,所以它可以说'self.view1.delegate = self.view2.delegate' – Paulw11

回答

0

见Paulw11的评论。我试图打破MVC和Xcode是反击。

因此,解决办法是要经过视图控制器,并放置一些代码,如:

class ViewController: UIViewController, DelegatingViewDelegate { 

override func viewDidLoad() { 
    super.viewDidLoad() 

    delegatingView.delegate = self 

} 

@IBOutlet weak var delegatingView: DelegatingView! 
在视图控制器

。请注意,在上面的代码片段中,delegatingView已被设置为出口,我可以通过它设置文本标签。