【问题标题】:Set up Delegate relationship between two views and send messages在两个视图之间建立委托关系并发送消息
【发布时间】:2015-06-30 05:48:36
【问题描述】:

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

如何在 Swift 代码中的视图之间建立委托关系,以便我可以在一个视图中从另一个视图发送消息/触发函数?

任何帮助将不胜感激!

【问题讨论】:

    标签: ios swift delegates uicontainerview


    【解决方案1】:

    假设您有两个视图 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
    }
    

    注意 :这只是两个类之间 swift 委托的粗略想法,您可以根据自己的需要进行自定义。

    【讨论】:

    • 嗨桑杰!只是被第6步弄糊涂了!我将在哪里输入此代码?您能否还扩展如何“创建 ViewB 实例并设置委托”?
    • 你好 Max,步骤 6 仅用于说明(这是一个示例函数)。在您创建 viewB 的实例之后,您可能会在某些事件中创建 viewB 的实例,然后在那里设置委托。
    • 您可以在 ViewA 类的任何方法中创建 ViewB 实例并将委托设置为 - var viewBInstance: ViewB = ViewB() viewBInstance.delegate = self
    • 现在 ViewA 类可以使用它的实例“viewBInstance”向 ViewB 类发送消息,并且我们已经将 viewBInstance 的委托属性设置为 self(这是 viewA 的引用),所以如果 ViewB 类想要向 ViewA 类的实例发送消息,它可以使用它的委托变量(并且由于委托变量持有类 ViewA 的引用,因此在委托上调用方法会将相应的消息发送到类 ViewA 的实例)。
    • 将其标记为正确,因为它是正确的,但对于其他试图解决此问题的人来说,我发现这篇文章有助于我确定每段代码的放置位置:makeapppie.com/2014/07/01/…
    【解决方案2】:

    为您的嵌入转场创建一个唯一标识符。

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

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

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

    (您还需要定义一个协议以从子级与父级进行通信,并设置父级以符合该协议。您应该为委托属性使用“delegate”以外的名称。假设您调用它是 `ParentVCDelegate" (因为很多 Apple 的类,比如 UITableViewController 已经有一个委托属性。)

    【讨论】:

      【解决方案3】:

      我想你真的想在这里使用 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 是一种更合适的数据传递方法。

      【讨论】:

        猜你喜欢
        • 2020-01-01
        • 1970-01-01
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-28
        • 2021-08-27
        • 1970-01-01
        相关资源
        最近更新 更多