如何将数据从一个容器快速传递到另一个容器,而这两个容器都迅速地嵌入了同一个uiviewcontroller中? [英] how can I pass data from one container to another, both embedded in the same uiviewcontroller in swift?

查看:51
本文介绍了如何将数据从一个容器快速传递到另一个容器,而这两个容器都迅速地嵌入了同一个uiviewcontroller中?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个父代 UIViewController ,它有两个不同的视图容器-每个容器都在其中嵌入了 UIViewController .看起来像这样:

I have a parent UIViewController and it has two different view containers - each of them has embedded UIViewController inside. It looks somehow like this:

我想在用户按下存储在左侧容器上的按钮时更改右侧容器上的标签.

I want to change the label on the right container when user presses the button stored on the left one.

到目前为止,我已经能够在将按钮放在父视图控制器中的同时做到这一点,然后我只是在使用一种协议:

So far I was able to do it while having a button placed in a parent view controller, then I was just using a protocol:

  • 在我的父组件中,我有:

  • in my parent component I had:

class ParentController: UIViewController {

    var delegateEmbedded:HandleEmbedded?

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if (segue.identifier == "segueToFirstEmbeddedController"){

        if let embeddedView = segue.destinationViewController as? EmbeddedContainer {

           self.delegateEmbedded = embeddedView
         } 


     }

  • 在我的容器嵌入式UIViewController中,我拥有:

  • in my container-embedded UIViewController I had:

    protocol HandleEmbedded: class {
        func setName(label: String)
    }
    
    class EmbeddedContainer: UITableViewController, HandleYourChat{
    
        func setName(label: String){
            print("setting label to \(label)")
        }
    }
    

  • 当我将按钮放置在父控制器中并且想要更改容器内的标签时,上述情况起作用.但是会发生什么,当按钮也被嵌入但与标签位于不同的容器中时,该如何传递数据呢?我是否必须通过父控制器传递数据?最好的方法是什么?

    Situation above works when I have the button placed in a parent controller and want to change the label inside a container. But what happens and how should I pass the data when the button is also embedded, but in a different container than the label? Do I have to pass the data through the parent controller? What's the best way for doing so?

    推荐答案

    要将数据从一个嵌入式ViewController传递到另一个嵌入式ViewController,请由父级处理传输.在这里,我提供了一个完整的示例,其中包含三个ViewController和一个 StringTaker 协议.主要的 ViewController LabelViewController 均实现此协议.主要的 ViewController ButtonViewController 中获取一个字符串,并将其传递给嵌入式的 LabelViewController .

    To pass data from one embedded ViewController to another embedded ViewController, have the parent handle the transfer. Here I have provided a complete example with three ViewControllers and a single StringTaker protocol. Both the main ViewController and the LabelViewController implement this protocol. The main ViewController takes a string from the ButtonViewController and passes it on to the embedded LabelViewController.

    ViewController.swift

    import UIKit
    
    protocol StringTaker: class {
        func takeString(string: String)
    }
    
    class ViewController: UIViewController, StringTaker {
    
        weak var stringTaker: StringTaker?
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            if segue.identifier == "EmbedButtonViewController" {
                let dvc = segue.destinationViewController as! ButtonViewController
                dvc.delegate = self
            } else if segue.identifier == "EmbedLabelViewController" {
                let dvc = segue.destinationViewController as! LabelViewController
                stringTaker = dvc
            }
        }
    
        // Receive the string from the ButtonViewController
        func takeString(string: String) {
            // Pass it to the LabelViewController
            stringTaker?.takeString(string)
        }
    }
    

    ButtonViewController.swift

    import UIKit
    
    class ButtonViewController: UIViewController {
    
        weak var delegate: StringTaker?
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        @IBAction func generateString(sender: UIButton) {
            let cities = ["Boston", "Paris", "Sydney", "Mumbai", "Lima"]
    
            // Pick a random city
            let city = cities[Int(arc4random_uniform(UInt32(cities.count)))]
    
            // Pass the string to the delegate
            delegate?.takeString(city)
        }
    }
    

    LabelViewController.swift

    import UIKit
    
    class LabelViewController: UIViewController, StringTaker {
    
        @IBOutlet weak var myLabel: UILabel!
    
        override func viewDidLoad() {
            super.viewDidLoad()
        }
    
        func takeString(string: String) {
            myLabel.text = string
        }
    }
    


    注意事项:


    Things to note:

    1. LabelViewController ButtonViewController 对使用它们的 ViewController 一无所知.这样可以更轻松地重用它们.您可以将它们嵌入另一个viewController中,只要正确实现 StringTaker 协议并设置 delegate ,一切正常.
    2. 命名嵌入segues,然后在 prepareForSegue 中正确设置委托的关键.将容器添加到 ViewController 后,可以在文档大纲视图中找到这些文件.
    1. The LabelViewController and the ButtonViewController know nothing about the ViewController that uses them. This makes it easier to reuse them. You could embed them in another viewController and as long as you properly implement the StringTaker protocol and set up the delegate, everything works.
    2. The key to hooking this up in in naming the embed segues and then properly setting up the delegates in prepareForSegue. The segues can be found in the Document Outline view once the Container is added to the ViewController.

    这篇关于如何将数据从一个容器快速传递到另一个容器,而这两个容器都迅速地嵌入了同一个uiviewcontroller中?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

    查看全文
    相关文章
    登录 关闭
    扫码关注1秒登录
    发送“验证码”获取 | 15天全站免登陆