簡體   English   中英

使用當前模式將數據從一個 uiviewcontroller 發送到另一個導航控制器

[英]Sending data from one uiviewcontroller to another navigationcontroller using present modally

我是 swift 的新手,我正在使用故事板並使用導航控制器從一個視圖控制器連接到另一個視圖控制器。 我想將單擊的圖像的名稱發送到下一個視圖控制器,該視圖控制器從 imageView 以模式連接在情節提要中。 我搜索了很多關於將數據從一個視圖控制器傳輸到另一個以模態方式連接到導航控制器的視圖控制器,但沒有可用的解決方案。 請讓我知道是否需要任何代碼,因為我不知道如何繼續。 我知道這可能是最愚蠢的問題,但在網上搜索了很多之后發布了這個問題。

根據@uraimo 回復進行編輯。

我是否需要為我在故事板上創建的每個 segue 提供名稱?。 我在 viewcontrollerA 上有 2 個固定圖像,我在每個圖像上放置了一個具有透明背景且沒有文本的 uibutton,然后按 ctrl 拖動到 viewcontrollerB 的導航控制器以進行模態呈現並展開后退按鈕,即 UIBarButtonItem 到 viewcontrollerA 通過 ctrl 拖動后退按鈕viewcontrollerB 退出 viewcontrollerB 並展開它。

這就是我如何創建從 viewcontrollerA 的 3 個圖像中的任何圖像單擊到 viewcontrollerB 並在單擊 viewcontrollerB 的后退按鈕時返回到 viewcontrollerA 的導航。 如果我做錯了什么,請告訴我,您的 prepareForSegue 代碼是否有助於完成我的任務。

基本上,無論是使用 IB 還是以編程方式進行時,您都必須在執行 segue 之前使用它需要的所有數據配置新的視圖控制器(或控制器通過代碼呈現)。

在您的情況下,只需設置圖像名稱(您的自定義視圖控制器類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 imageNamed: ),因為它不再可用,您必須使用accessibilityIdentifier

這使一切變得更加復雜,似乎可以在此處此處以圖形方式完成大部分工作(但尚不清楚如何做到這一點),但通常通過代碼完成。

使用全局變量稍微簡化一下:

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都有一個標識符。 但是請記住,segue 並不是從一個控制器轉到另一個控制器的唯一方法,如果您完全以編程方式(沒有 segue)執行此操作,您通常將其稱為“presentViewController”。 Segues 是一個故事板概念。

同樣,關於轉場名稱/標識符,您直到現在才需要它,因為您從未從您的代碼中引用該轉場,因此 prepareForSegue 和 performSegueWithIdentifier 都需要它。 只需選擇 segue 並在右側檢查器窗格中為其命名。

您描述的結構似乎沒問題,唯一的問題是我不太確定 UIButtons 是否真的需要,請嘗試從 imageview 或直接從 viewcontroller 到目標視圖控制器的模式 segue。

更新 2:

如果您開始並需要一門免費課程來教您基礎知識並讓您構建一些有趣的 ios 應用程序,我建議您使用hackingwithswift

看看我是怎么做到的

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM