Отправка данных из одного контроллера uiview в другой контроллер навигации с использованием модального представления

Я новичок в Swift, я использую раскадровку и использовал навигационные контроллеры для подключения от одного контроллера представления к другому. Я хочу отправить имя изображения, на которое нажали, следующему контроллеру представления, который модально подключен к раскадровке из изображения. Я много искал о передаче данных из одного контроллера просмотра в другой контроллер просмотра, модально связанный с навигационным контроллером, но решение не было доступно. Пожалуйста, дайте мне знать, если какой-либо код требуется, поскольку я не знаю, как это сделать. Я знаю, что это может быть глупейший вопрос, но публикую его после долгих поисков в сети.

РЕДАКТИРОВАТЬ в соответствии с ответом @uraimo.

Нужно ли указывать имя для каждого перехода, который я создал на раскадровке? У меня есть 2 фиксированных изображения на viewcontrollerA, и я поместил uibutton с прозрачным фоном и без текста на каждом из них, а затем перетащите Ctrl на навигационный контроллер viewcontrollerB для модального представления и разматывания кнопки возврата, т.е. UIBarButtonItem для viewcontrollerA с помощью Ctrl перетащите кнопку «Назад» viewcontrollerB, чтобы выйти из viewcontrollerB и размотать его.

Вот как я создал навигацию от любого изображения, щелкнув из 3 изображений viewcontrollerA к viewcontrollerB и обратно к viewcontrollerA при нажатии кнопки «Назад» viewcontrollerB. Пожалуйста, дайте мне знать, если я делаю что-то не так, и будет ли ваш код prepareForSegue полезен для выполнения моей задачи.


person Niranjan Balkrishna Prajapati    schedule 13.10.2015    source источник
comment
Вы все делаете через раскадровку? У вас уже настроен модальный переход?   -  person Umberto Raimondi    schedule 13.10.2015
comment
да подключил весь навигационный контроллер к изображению или кнопке, используя модальную опцию раскадровки   -  person Niranjan Balkrishna Prajapati    schedule 13.10.2015
comment
Вы пытались переопределить func prepareForSegue(segue: UIStoryboardSegue!, sender: AnyObject!) { if (segue.identifier == Load View) { // передать данные в следующее представление } } ??   -  person Eluss    schedule 13.10.2015
comment
@Eluss, можете ли вы предоставить мне описание того, что делает этот код и как получить данные в другом контроллере представления?   -  person Niranjan Balkrishna Prajapati    schedule 13.10.2015
comment
Конечно, в prepareForSegue вы можете получить контроллер целевого представления и установить некоторые свойства, например свои данные. Сначала вы должны распознать переход по идентификатору, который вы указали в своей раскадровке, затем вы можете получить доступ к целевому контроллеру представления с помощью segue.destinationViewController и установить необходимые свойства.   -  person Eluss    schedule 13.10.2015
comment
prepareForSegue недостаточно :( , ему нужно каким-то образом получить имя изображения, см. ответ.   -  person Umberto Raimondi    schedule 13.10.2015


Ответы (2)


По сути, как с помощью IB, так и когда вы делаете это программно, вы должны настроить свой новый контроллер представления со всеми необходимыми данными, прежде чем будет выполнен переход (или контроллер будет представлен через код).

В вашем случае просто установите имя изображения (ваш собственный класс контроллера представления 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, который при щелчке будет выполнять созданный вами переход. Кроме того, вы не сможете получить имя ресурса изображения (тот, который вы используете при создании 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 есть идентификатор. Но помните, переходы — не единственный способ перехода от одного контроллера к другому, если вы делаете это полностью программно (без переходов), вы обычно вызываете «presentViewController». Segues — это концепция раскадровки.

Опять же, что касается имени/идентификатора перехода, он вам не нужен до сих пор, потому что вы никогда не ссылались на этот переход из своего кода, он нужен вам как для prepareForSegue, так и для PerformSegueWithIdentifier. Просто выберите переход и дайте ему имя на правой панели инспектора.

Структура, которую вы описываете, выглядит нормально, единственное, что я не уверен, что UIButtons действительно нужны, попробуйте с модальным переходом от изображения или непосредственно от контроллера представления к целевому контроллеру представления.

Обновление 2:

Если вы начинаете и вам нужен бесплатный курс, который научит вас основам, а также заставит вас создать несколько интересных приложений для iOS, я рекомендую hackingwithswift. .

person Umberto Raimondi    schedule 13.10.2015
comment
Спасибо за ответ, извините за глупые сомнения, редактируя мой вопрос в соответствии с этим. - person Niranjan Balkrishna Prajapati; 13.10.2015
comment
@NiranjanBalkrishnaPrajapati Обновлено! - person Umberto Raimondi; 13.10.2015
comment
Большое спасибо за объяснение и ссылку. Кстати, я решил свою проблему с помощью 1-й части кода, который вы предоставили, т.е. prepareForSegue, поскольку я уже использовал прозрачные UIButtons для перехода в раскадровке, я знаю, что это неправильный способ перехода от UIImageView. Но большое спасибо за решение моей проблемы и предоставление замечательной ссылки для быстрого обучения. У меня есть еще некоторые сомнения в быстроте, не могли бы вы помочь мне решить эту проблему? - person Niranjan Balkrishna Prajapati; 13.10.2015
comment
Нет проблем, не стесняйтесь задавать другие вопросы, для этого и нужен stackoverflow :) - person Umberto Raimondi; 13.10.2015
comment
Ссылка stackoverflow.com/questions/33103482/ на другой вопрос, пожалуйста, помогите мне. - person Niranjan Balkrishna Prajapati; 13.10.2015

посмотри как я это сделал

// 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)")
      }
  }
person Dan Alboteanu    schedule 29.04.2020