Intereting Posts
OS X / iOS и TCP: Почему CFSocketSendData сбой приложения, вызванного после сброса соединения? Загрузка фото в iOS из Share Extension, ответ при загрузке Ничего не получилось! сертификаты и снабжение превратили мою жизнь в живой ад Преобразование в NSDate из NSString: как игнорировать часовой пояс Как избежать вызова метода несколько раз, когда метод занимает много времени, чтобы завершить Новое для быстрого: почему таймер не обновляется до UILabel? Objective C – iOS, итерация через UILabels в ячейках статической таблицы вне экрана Автоотключение для размещения 4 видов с одинаковой шириной Пользовательский вкладчик Tabgroup Multipeer Connectivity перестает работать, когда пользователь отключается и подключается к Bluetooth Facebook поп-каркас: взгляд сошел с ума после ротации Веб-анимация ionic 2 iOS uinavigationController leftButton frame issue ios6 и ios 7 Значок значка Push Notification Not Updating Использование стручков с игровыми площадками в Xcode 9 (бета)

Каков правильный способ использования геттеров / сеттеров

Приветствия,

Это является следствием моего предыдущего сообщения ( неверные данные передаются при первом нажатии кнопки ). На это был дан ответ, но обновленное редактирование, конечно, произошло.

Мой запрос таков: на данный момент у меня есть две функции IBActions, которые пустые, не имеют какого-либо кода, и их единственная цель для существования состоит в том, что они связаны с моим другим контроллером представления, и как таковой, если я удалю их, у меня нет способ различать между тем, какой segue следует использовать (я понимаю, что, хотя мы можем создавать сегменты между двумя контроллерами представлений, я не думаю, что что-то большее, чем одно имеет смысл (как, как решить, с кем идти). отвлекся.

Я пробовал использовать в своем коде следующее:

self.performSegue(withIdentifier: "slideTwo", sender: self); 

Это хорошо работает, однако, это вызывает двойное переключение. Поэтому я решил:

 override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let passedPic = segue.destination as! ViewControllerTwo; if(segue.identifier == "slideOne") { passedPic.picsChosen = sLS1; } else { passedPic.picsChosen = sLS2; } } 

Это хорошо работает, делает то, что мне нужно, но у меня есть проблема двух пустых IBActions:

 @IBAction func slideShowOne() { } @IBAction func slideShowTwo() { //self.performSegue(withIdentifier: "slideTwo", sender: self); } 

Здесь я подумал, что, возможно, я мог бы попытаться создать геттер / сеттер (который быстро делает намного сложнее, чем это должно быть честно). Здесь я потерялся.

Код выглядит следующим образом:

 var picsChosen : [String] { set(newData) { for index in 0..<newData.count { print("Index is: ", newData[index]); } self._picsChosen = newData; } get { return self._picsChosen; } } 

Теперь моя проблема в два раза. Во-первых, каков правильный способ доступа и передачи значений в мою переменную. Я пробовал делать: myClass: ViewControllerTwo! = ViewControllerTwo(); myClass: ViewControllerTwo! = ViewControllerTwo();

а затем используйте myClass.picsChosen = myArray; Однако, хотя кажется, что данные были успешно переданы в мой VC2, поскольку, когда я прохожу через (внутри сеттера), я вижу, что значения успешно отображаются, когда я пытаюсь получить доступ к picsChosen за пределами этого, я получаю индекс из другими словами, значение никогда не ассоциировалось с picsChosen . Текущий способ, который у меня есть, хорошо работает, но я хочу знать, как правильно использовать геттеры / сеттеры, и почему то, что у меня не получилось.

Ура!

Это хорошо работает, делает то, что мне нужно, но у меня есть проблема двух пустых IBActions:

Вам не нужны эти пустые @IBAction s. Они ничего не делают для вас. Сегеры связаны с кнопками в Раскадке, поэтому вам не нужны @IBAction . Если вы удаляете код, вам также необходимо удалить соединение с раскадровки, или ваше приложение @IBAction крах при @IBAction вызвать удаленные @IBAction s. Чтобы удалить, нажмите «Ctrl» на кнопках в раскадровке, а затем нажмите маленький x рядом с « Touch Up Inside», чтобы удалить соединение. Затем вы можете удалить @IBAction в своем коде.

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

Не правда. У вас есть два разных сегмента, связанных с двумя разными кнопками. Идентификаторы segue – это то, как вы проводите различие между двумя сегментами.

Я пробовал делать: myClass: ViewControllerTwo! = ViewControllerTwo(); myClass: ViewControllerTwo! = ViewControllerTwo();

При использовании segue, segue создает для вас viewController назначения. Это не работает, потому что вы создаете совершенно новый ViewControllerTwo здесь. Вы передаете значения этому новому экземпляру, но это не ViewControllerTwo что созданный для вас ViewControllerTwo Storyboard.

При использовании segues вы должны передать данные в процессе prepare(for:sender:) , как показано выше. Получите целевой ViewController и заполните данные, которые вы хотите передать.

И теперь на вопрос вы не спросили:

Как я мог это сделать, используя @IBAction s для запуска segue?

  1. Удалите сегменты, которые связаны с вашими кнопками.

  2. Проводьте segue из viewController1 в viewController2. Нажмите стрелку slideShow в раскадровке и назначьте slideShow шоу идентификатора.

  3. Назначьте уникальные теги для двух кнопок. Вы можете установить это в Interface Builder . Дайте первый тег кнопки 1 и второй тег кнопки 2 .

  4. Ваши кнопки могут использовать один и тот же @IBAction :

     @IBAction func goToSlideShow(button: UIButton) { self.performSegue(withIdentifier: "slideShow", sender: button) } 
  5. В prepare(for:sender:) :

     override func prepare(for segue: UIStoryboardSegue, sender: Any?) { let passedPic = segue.destination as! ViewControllerTwo if let button = sender as? UIButton { if button.tag == 1 { passedPic.picsChosen = sLS1 } else if button.tag == 2 { passedPic.picsChosen = sLS2 } } }