По сути, как с помощью 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