swift2 使用present模式从一个uiviewcontroller向另一个navigation controller发送数据

5lhxktic  于 2022-11-06  发布在  Swift
关注(0)|答案(2)|浏览(191)

我是swift的新手,我正在使用故事板,并且已经使用navigationcontrollers从一个viewcontroller连接到另一个。我想将单击的图像的名称发送到下一个viewcontroller,它是从imageView在故事板中模态连接的。我搜索了很多关于将数据从一个viewcontroller传输到另一个与navigationcontrollers模态连接的viewcontroller的信息,但没有可用的解决方案。请让我知道,如果任何代码是必需的,因为我不知道如何继续下去。我知道这可能是最愚蠢的问题,但张贴后,在网上搜索了很多。
EDIT根据@uraimo回复。
我需要为我在故事板上创建的每个segue提供名称吗?我在viewcontrollerA上有2个固定图像,我在每个图像上放置了一个透明背景的uibutton,没有文本,然后按Ctrl键拖动到viewcontrollerB的导航控制器,以模态呈现并展开backbutton,即UIBarButtonItem到viewcontrollerA,通过ctrl拖动viewcontrollerB的后退按钮,退出viewcontrollerB并展开它。
这就是我如何创建导航从任何图像点击出3个图像的viewcontrollerA到viewcontrollerB,并返回到viewcontrollerA的返回按钮点击viewcontrollerB。请让我知道,如果我做错了什么,将您的prepareForSegue代码是有用的,在完成我的任务。

brc7rcf0

brc7rcf01#

基本上,无论是使用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添加一个click事件来获得。
所以,你需要一个uigesturerecognized,它会在点击时执行你创建的segue。而且,你将无法获得图像资源的名称(你使用imageNamed:创建UIImage时使用的名称),因为它不再可用,你将不得不使用accessibilityIdentifier
这使得一切都变得更加复杂,看起来大部分可以通过图形herehere来完成(但实际上并不清楚如何完成),但通常是通过代码来完成的。
使用全局变量稍微简化一下:

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

更新日期:

  • 我需要为我在故事板上创建的每个片段提供名称吗?

是的,这是唯一的方法来识别它们,每个UIStoryboardSegue都有一个标识符。但是请记住,segues不是从一个控制器到另一个控制器的唯一方法,如果你完全通过编程来完成(没有segues),你通常称之为“presentViewController”。
同样,关于segue名称/标识符,您直到现在才需要它,因为您从未从代码中引用过该segue,您需要它用于prepareForSegue和performSegueWithIdentifier。只需选择该segue并在右侧的检查器窗格中给予命名即可。
你描述的结构看起来不错,唯一的问题是我不确定是否真的需要UIButton,尝试从imageview或直接从viewcontroller到目标视图控制器的模态segue。

更新2:

如果你正在开始,需要一个免费的课程,将教你的基础知识,也让你建立一些有趣的ios应用程序,我推荐hackingwithswift

kulphzqa

kulphzqa2#

看看我是怎么做到的

// 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)")
      }
  }

相关问题