Изпращане на данни от един uiviewcontroller към друг навигационен контролер чрез модално присъствие

Нов съм в swift, използвам сценарий и съм използвал навигационни контролери за свързване от един контролер на изглед към друг. Искам да изпратя името на кликнатото изображение до следващия контролер за изглед, който е свързан модално в сценария от imageView. Търсих много за прехвърляне на данни от oneviewcontroller към друг viewcontroller, свързан с navigationcontroller модално, но не беше налично решение. Моля, уведомете ме, ако някой от кода е необходим, тъй като не знам как да продължа с него. Знам, че това може да е най-глупавият въпрос, но публикувам това след много търсене в мрежата.

РЕДАКТИРАНЕ според отговора на @uraimo.

Трябва ли да предоставя име на всяка сегия, която създадох в сценария?. Имам 2 фиксирани изображения на viewcontrollerA и поставих uibutton с прозрачен фон и без текст върху всяко от тях и след това ctrl плъзнете към контролера за навигация на viewcontrollerB за модално представяне и отвиване на бутона за връщане, т.е. UIBarButtonItem към viewcontrollerA чрез ctrl плъзнете бутона за връщане назад на viewcontrollerB, за да излезете от viewcontrollerB и да го развиете.

Ето как създадох навигация от което и да е щракване върху изображението от 3 изображения на viewcontrollerA към viewcontrollerB и обратно към viewcontrollerA при щракване върху бутона за заден ход на viewcontrollerB. Моля, уведомете ме, ако правя нещо нередно и ще бъде ли вашият подготвителен код полезен за изпълнението на задачата ми.


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 pripraveForSegue(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
Разбира се, в preparatForSegue можете да получите дестинационен изглед контролер и да зададете някои свойства, например вашите данни. Първо трябва да разпознаете идентификатора на segue, който сте поставили във вашия сториборд, след което можете да получите достъп до контролера за целеви изглед чрез segue.destinationViewController и да зададете необходимите свойства.   -  person Eluss    schedule 13.10.2015
comment
подготвитеForSegue не е достатъчно :(, той трябва да получи името на изображението по някакъв начин, вижте отговора.   -  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.

И така, ще ви е необходим разпознат жест, който при щракване ще изпълни създаденото от вас преминаване. Освен това няма да можете да получите името на актива на изображението (този, който използвате за създаване на 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 са концепция за сценарий.

Отново, по отношение на името/идентификатора на segue, не сте имали нужда от него досега, защото никога не сте препращали към този segue от вашия код, имате нужда от него и за подготвитеForSegue, и за 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
Благодаря ви много за обяснението и връзката Между другото, аз реших проблема си с първата част от кода, който предоставихте, т.е. подготвитеForSegue, тъй като вече използвах прозрачни UIButtons за преминаване в сценария, знам, че това не е правилният начин за преминаване от UIImageView. Но благодаря много, че решихте проблема ми и предоставихте прекрасна връзка за бързо обучение. Имам още съмнения относно Swift, можете ли да ми помогнете да го реша? - person Niranjan Balkrishna Prajapati; 13.10.2015
comment
Няма проблем, не се колебайте да отворите други въпроси, за това е stackoverflow :) - person Umberto Raimondi; 13.10.2015
comment
Уважаеми uraimo, можете ли да ми предоставите вашия контакт във Facebook, за да можем да се свържем и да науча добри неща от вас. моят id е facebook.com/niranjan.b.prajapati любезно добавете ме, аз съм публикуване на друг въпрос, моля, помогнете ми и там - person Niranjan Balkrishna Prajapati; 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