2017-01-18 6 views
2

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

Это является продолжением моего предыдущего поста (Incorrect data passed on first click of button). На это был дан ответ, но обновленное редактирование, конечно, произошло.

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

Я попытался с помощью следующих в моем коде раньше:.

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.picsChosen = myArray; Однако, несмотря на это, действительно кажется, что данные были успешно прошли в мою VC2, так как при отображении я Переберите (внутри сеттера) Я вижу Удачно значения, когда я попробуйте получить доступ к picsChosen за пределами этого. Я получаю ошибку индекса за пределами границ, другими словами, значение никогда не ассоциировалось с picsChosen. Текущий способ, который у меня есть, хорошо работает, но я хочу знать, как правильно использовать геттеры/сеттеры, и почему то, что у меня не получилось.

Cheers!

+0

его очень трудно понять, что вы делаете, и то, что ваши фактические требования, ваши проблемы похоже, больше с segue, чем getter/setter, и вам совершенно не нужен getter/setter для чего-то подобного, так как вы ничего не вычисляете при получении данных – Tj3n

ответ

3

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

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

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

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

Я попытался сделать: myClass: ViewControllerTwo! = ViewControllerTwo();

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

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

А теперь вопрос, который вы не спрашивали:

Как я мог бы сделать это с помощью @IBAction с, чтобы вызвать SEGUE?

  1. Удалите перетекает, которые проводными от ваших кнопок.

  2. Проводят переход из видаController1 to viewController2. Нажмите стрелку segue в Раскадке и назначьте идентификатор 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 
         } 
        } 
    } 
    
+0

Спасибо за ответ, я дам этот снимок завтра утром. Теперь, в прошлый раз, у меня было как self.performsegue вместе с подготовкой, он сделал двойной segue. То же самое произойдет здесь? Кроме того, я полагаю, что я должен удалить два своих сегмента, которые у меня есть, начиная с кнопок, а вместо этого просто сделаю от одного VC к другому, правильно? – SomeStudent

+0

Вы получали двойную сегую, потому что вы подключили сегу от кнопки. Если вы хотите называть их 'performSegue', вам необходимо подключить их с помощью значка viewController в верхней части VC1-VC2. Нет ничего плохого в том, как ты это делаешь сейчас. Просто избавитесь от этих пустых @IBActions. – vacawama

+0

Да, если вы собираетесь использовать 'performSegue', удалите два ряда, которые вы выбрали с помощью кнопок. – vacawama

Смежные вопросы