在两个视图之间设置委托关系并发送消息

时间:2015-04-22 13:54:49

标签: ios swift delegates uicontainerview

在iOS中,我正在使用Swift构建应用程序。我有一个视图,其中设置了容器视图,链接嵌入视图。这是使用Storyboard设置的。

如何在Swift代码中的视图之间设置委托关系,以便我可以在另一个视图中发送消息/触发器功能?

任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:6)

假设您有两个观看次数ViewAViewB

ViewB内创建了ViewA的实例,因此ViewA可以向ViewB's实例发送消息,但为了反过来,我们需要实现委派(以便使用委托ViewB's实例可以向ViewA发送消息)

按照以下步骤实施委派

1)在ViewB创建协议

protocol ViewBDelegate{
    func delegateMethod(controller:ViewB, text:String)
}

2)在发送者类

中声明委托
class ViewB: UIView {
    var delegate: ViewBDelegate! = nil
}

3)使用类中的方法将委托方法调用为

@IBAction func callDelegateMethod(sender : UIBarButtonItem) {
        delegate!. delegateMethod(self, text: colorLabel.text)
 //assuming the delegate is assigned otherwise error
}

4)采用ClassA中的协议

class ViewA: UIView, ViewBDelegate {

5)实施委托

func delegateMethod(controller: ViewB, text: String) {
    label.text = "The text is " +  text
}

6)设置代理

override func anyFuction() 
{
      // create ViewB instance and set the delegate
      viewB.delegate = self
}

注意:这只是两个类之间快速授权的粗略概念,您可以根据自己的要求对其进行自定义。

答案 1 :(得分:0)

为嵌入segue创建唯一标识符。

在父视图控制器中,实现prepareForSegue方法。

使用switch语句匹配segue标识符。对于包含的视图控制器,从segue获取目标视图控制器属性,将其强制转换为自定义目标视图控制器的类型,并设置它的委托属性。

如果您需要一种持续发送父对子消息的方法,还应该在prepareForSegue中保存指向子视图控制器的指针。

(您还需要定义一个协议,以便从子进程与父进行通信,并设置父进程以符合该协议。您应该为委托属性使用“委托”以外的名称。它是`ParentVCDelegate'(因为许多像UITableViewController这样的Apple类已经有了委托属性。)

答案 2 :(得分:0)

我觉得你真的想在这里使用segue吗?在之前的项目中,我制作了一个重载的UIView控制器,可以将数据从控制器传递给控制器​​。

我们有一个名为RestFlightVariables的数据容器类和另一个名为rest的容器,它们都存储了要在控制器之间传递的特定信息。

然后我们创建了RESTUIViewController,它有一个重载的prepareForSegue函数。如果控制器正在划分的类也是RESTUIViewController,则传递变量restrestVars

/**
RESTUIViewController is an overloaded UIVIewcontroller that handles the     passing of REST variables between view controllers
*/
class RESTUIViewController : ResponsiveTextFieldViewController {
    var rest : RESTInterface?
    var restVars : RESTFlightVariables?

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    print("----- RESTUIViewController Segue -----")
    let nextVC = segue.destinationViewController as RESTUIViewController
        nextVC.rest = self.rest
        nextVC.restVars = self.restVars
}

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

另一种选择可能是使用 NSNotification 系统,但是当您在视图之间传递数据时,这并不合适。 Segues 是一种更合适的数据传递方法。