使用当前模态将数据从一个 uiviewcontroller 发送到另一个 navigationcontroller

Posted

技术标签:

【中文标题】使用当前模态将数据从一个 uiviewcontroller 发送到另一个 navigationcontroller【英文标题】:Sending data from one uiviewcontroller to another navigationcontroller using present modally 【发布时间】:2015-10-13 09:49:12 【问题描述】:

我是 swift 新手,我正在使用故事板并使用导航控制器从一个视图控制器连接到另一个视图控制器。我想将单击的图像的名称发送到下一个视图控制器,该视图控制器在情节提要中从 imageView 模态连接。我搜索了很多关于将数据从一个视图控制器传输到另一个与导航控制器连接的视图控制器,但没有可用的解决方案。请让我知道是否需要任何代码,因为我不知道如何继续。我知道这可能是最愚蠢的问题,但是在网上搜索了很多之后才发布。

根据@uraimo 回复编辑。

我需要为我在情节提要上创建的每个 segue 提供名称吗? 我在 viewcontrollerA 上有 2 个固定图像,并且我在每个图像上放置了一个具有透明背景且没有文本的 uibutton,然后 ctrl 拖动到 viewcontrollerB 的导航控制器以 模态显示 并展开后退按钮,即 UIBarButtonItem 到 viewcontrollerA通过 ctrl 拖动 viewcontrollerB 的后退按钮退出 viewcontrollerB 并展开它。

这就是我创建导航的方式,从单击 viewcontrollerA 的 3 个图像中的任何一个图像到 viewcontrollerB,然后在单击 viewcontrollerB 的后退按钮时返回到 viewcontrollerA。 如果我做错了什么,请告诉我,您的 prepareForSegue 代码对完成我的任务是否有用。

【问题讨论】:

你所有的事情都是通过故事板做的吗?您是否已经设置了模态转场? 是的,使用故事板显示模式选项将所有导航控制器连接到图像视图或按钮 你是否尝试覆盖 func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) if (segue.identifier == "Load View") // 将数据传递到下一个视图 ?? @Eluss 你能告诉我这段代码的作用以及如何在另一个视图控制器中检索数据 当然,在 prepareForSegue 中,您可以获取目标视图控制器并设置一些属性,例如您的数据。首先,您必须通过放入故事板的标识符来识别 segue,然后您可以通过 segue.destinationViewController 访问目标视图控制器并设置所需的属性。 【参考方案1】:

基本上,无论是使用 IB 还是以编程方式进行时,您都必须在执行 segue(或通过代码呈现控制器)之前使用它需要的所有数据配置新的 viewcontroller。

在您的情况下,只需设置图像名称(您的自定义视图控制器类 YourViewController 应该具有特定的 String 属性来保存此值)覆盖当前视图控制器类中的 prepareForSegue

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
        if segue.identifier == "yourModalSegueIdentifier" 
            let imgName= (sender as! UIImageView)
            let destination = segue.destinationViewController as UINavigationController
            let yourController = destination.topViewController as YourViewController
            yourController.imageName= <name here>
        

这解决了传递数据的问题。

但是在您的情况下,您需要单击图像的名称,并且只能通过 UIGestureRecognizer 将单击事件添加到 UIImageView 来获得。

因此,您需要一个 uigesturerecognized,点击后将执行您创建的转场。此外,您将无法获得图像资产的名称(您使用 imageNamed: 创建 UIImage 的名称),因为它不再可用,您将不得不使用 accessibilityIdentifier

这让一切变得更加复杂,似乎大部分情况下都可以通过图形方式完成here 和here(但不清楚如何操作),但通常通过代码完成。

使用全局变量稍微简化一下:

var currentImage = ""

func viewDidLoad()
    ...
    ...
    let aTap = UITapGestureRecognizer(target: self, action: Selector("imageTapped:"))
    aTap.numberOfTapsRequired = 1

    //For every image, configure it with recognizer and accessibilityId:
    firstImage.userInteractionEnabled = true
    firstImage.addGestureRecognizer(aTap)
    firstImage.accessibilityIdentifier = "firsImage"
    ...


func imageTapped(recognizer:UITapGestureRecognizer) 
    let imageView = recognizer.view as! UIImageView
    currentImage = imageView.accessibilityIdentifier
    self.performSegueWithIdentifier("yourModalSegueIdentifier", sender: self)

然后改变这个:

yourController.imageName= <name here>

到这里:

yourController.imageName= currentImage

更新:

我是否需要为我在情节提要上创建的每个 segue 提供名称?

是的,这是识别它们的唯一方法,每个UIStoryboardSegue 都有一个标识符。但请记住,segue 并不是从一个控制器到另一个控制器的唯一方法,如果您完全以编程方式(没有 segue)进行操作,您通常称为“presentViewController”。 Segues 是一个故事板概念。

同样,关于 segue 名称/标识符,您直到现在才需要它,因为您从未从代码中引用过该 segue,您需要它来用于 prepareForSegue 和 performSegueWithIdentifier。只需选择 segue 并在右侧检查器窗格中为其命名。

你描述的结构看起来不错,唯一的一点是我不太确定 UIButtons 是否真的需要,尝试从图像视图或直接从视图控制器到目标视图控制器的模态segue。

更新 2:

如果您刚开始并需要一门免费课程来教您基础知识并让您构建一些有趣的 ios 应用程序,我推荐hackingwithswift。

【讨论】:

感谢您的回复,抱歉有些愚蠢的疑问,请根据此编辑我的问题。 @NiranjanBalkrishnaPrajapati 更新! 非常感谢您的解释和链接顺便说一句,我用您提供的第一部分代码解决了我的问题,即 prepareForSegue,因为我已经在故事板中使用透明 UIButtons 进行 segue 我知道这不是正确的方法从 UIImageView 开始。但是非常感谢您解决了我的问题并为快速学习提供了精彩的链接。我对swift还有一些疑问,你能帮我解决吗? 没问题,请随意打开其他问题,这就是 *** 的用途:) 尊敬的 uraimo,能否请您提供您的 facebook 联系方式,以便我们联系,我可以向您学习好东西。我的 id 是 facebook.com/niranjan.b.prajapati 请加我,我正在发布另一个问题,也请帮助我【参考方案2】:

看看我是怎么做到的

// In a storyboard-based application, you will often want to do a little preparation before navigation
  override func prepare(for segue: UIStoryboardSegue, sender: Any?) 

      super.prepare(for: segue, sender: sender)

      switch(segue.identifier ?? "") 

      case "AddItem":
          let destination = segue.destination as? UINavigationController
          guard let itemViewController = destination?.topViewController as? ItemViewController else 
              fatalError("Unexpected destination: \(segue.destination)")
          
          itemViewController.collection = collection

      case "EditCollection":
          guard let collectionViewController = segue.destination as? EditCollectionViewController else 
              fatalError("Unexpected destination: \(segue.destination)")
          
          collectionViewController.collection = collection

      default:
          fatalError("Unexpected Segue Identifier; \(segue.identifier)")
      
  

【讨论】:

以上是关于使用当前模态将数据从一个 uiviewcontroller 发送到另一个 navigationcontroller的主要内容,如果未能解决你的问题,请参考以下文章

如何使用VueJS在模态中复制当前行的数据?

使用委托将数据从模态视图传递到父视图(在情节提要中使用 segue)

如何更新主表当前行的输入类型文本中的值从模态窗口表中获取值

从当前模态的委托中呈现 UIAlertView

iPhone:如何从左到右制作当前的模态视图控制器动画

将数据从模态 segue 传递给父级