当前位置: 首页 > 面试题库 >

如何将数据从一个容器快速传递到另一个容器,而这两个容器都迅速地嵌入了同一个uiviewcontroller中?

平航
2023-03-14
问题内容

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

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

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

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

    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中,我有:

        protocol HandleEmbedded: class {
        func setName(label: String)
    }

嵌入式容器类:UITableViewController,HandleYourChat {

        func setName(label: String){
            print("setting label to \(label)")
        }
    }

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


问题答案:

要将数据从一个嵌入式ViewController传递到另一个嵌入式ViewController,请让父级处理传输。在这里,我提供了一个完整的html" target="_blank">示例,其中包含三个ViewController和一个StringTaker协议。主要ViewController和LabelViewController实现此协议。mainViewController从中获取一个字符串ButtonViewController,并将其传递给嵌入式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
    }
}

注意事项:

  1. 使用它们的LabelViewControllerButtonViewController对此一无所知ViewController。这使得重用它们变得更加容易。您可以将它们嵌入另一个viewController中,只要您正确实现StringTaker协议并设置delegate,一切正常。
  2. 命名嵌入segues然后在中正确设置代表的关键prepareForSegue。将容器添加到中后,可以在“ 文档大纲”视图中找到这些序列。ViewController


 类似资料:
  • 我有两张docker的照片。其中一个docker映像(来自第一个容器)在运行时会生成一些文件,这些文件需要由另一个容器使用。 我可以这样做吗?

  • 我正在尝试以下操作: 在一个带有暴露端口的容器中旋转MySQL 5.5,例如4200。 在一个带有暴露端口的容器中旋转MySQL 5.7,例如4300。 旋转golang容器以运行我的应用程序。 我的想法是我需要我的测试在不同的数据库版本上运行。 为此,我需要能够与golang容器中的每个sql容器进行对话。 我试过的: 方法1-使用--link: GO LANG应用程序容器 方法2-使用--ne

  • 问题内容: 我和一个拥有我所有资产的工具都来自grunt或其他一些工具。 现在在docker compose文件中,我想将的文件夹路径装入到其中,以便nginx可以提供该文件。 我们该怎么做?我不记得了,但我认为有一种选择可以使我们将一个容器的路径与另一个容器共享。 假设如果我将nginx扩展到2个容器,那么该安装将适用于所有nginx实例吗? 如果我扩大规模,那会发生什么? 我也想将其安装在主机

  • 我想在一个docker容器中运行Rabbitmq服务器,并使用芹菜从另一个容器连接到它(http://celeryproject.org/) 我已使用以下命令运行rabbitmq。。。 然后通过 当我试图做非常基本的教程来验证http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html 我得

  • 问题内容: 我基于两个不同的图像创建了两个docker容器。一个数据库,另一个用于网络服务器。这两个容器都在我的Mac OS X上运行。 我可以从主机访问数据库容器,也可以从主机访问Web服务器。 但是,如何从Web服务器访问数据库连接? 我启动数据库容器的方式是 我开始了wls容器作为 我可以通过连接到主机上的数据库 我可以以以下方式访问主机上的wls: 问题答案: 最简单的方法是使用–link

  • 我基于两个不同的映像创建了两个docker容器。一个是db,另一个是WebServer。这两个容器都在我的mac OSX上运行。 我可以从主机访问db容器,也可以从主机访问webserver。 我可以访问主机上的wls作为