在UIViews之间进行委托 - 在哪里放置接收者的委托?
问题描述:
我有两个观点:在UIViews之间进行委托 - 在哪里放置接收者的委托?
委派视图中,带有“发送”按钮按下时调用通过委托
接收视图带有标签的的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")
}
}
答
见Paulw11的评论。我试图打破MVC和Xcode是反击。
因此,解决办法是要经过视图控制器,并放置一些代码,如:
class ViewController: UIViewController, DelegatingViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
delegatingView.delegate = self
}
@IBOutlet weak var delegatingView: DelegatingView!
在视图控制器
。请注意,在上面的代码片段中,delegatingView已被设置为出口,我可以通过它设置文本标签。
您不会在任何设置代表的地方显示。您必须在视图控制器中执行此操作。事实上,它可能是视图控制器应该是委托,它应该更新文本字段。 – Paulw11
好吧,我可以委托给视图控制器,并通过在视图控制器中设置委托来设置视图的文本字段。但这是间接的沟通,并不是我想要的。我不能让两种观点相互“交谈”吗?这是否违反了MVC?我认为代表团是解决这些问题的方法。为什么不receiver.delegate =自我工作(显然不) –
你在做什么是违反MVC。您所面临的挑战是委托人需要参考委托人才能将自己设置为委托人。现在你的视图控制器将引用两个项目,所以它可以说'self.view1.delegate = self.view2.delegate' – Paulw11