По принцип, както с помощта на 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