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



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



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



Мой запрос заключается в следующем: на данный момент у меня есть две функции 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);

}


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



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



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 за пределами этого я получаю индекс ошибки out of bounds, другими словами, значение никогда не было связано с picsChosen. Текущий способ у меня работает хорошо, но я хочу знать, как правильно использовать геттеры/сеттеры, и почему то, что у меня не работает.



Ура!

567   1  

1 ответ:

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

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

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

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

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

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

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

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

Как я мог сделать это, используя @IBActions, чтобы вызвать Сеге?

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

  2. Подключите сегмент от viewController1 к 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
            }
        }
    }
    

Comments

    Ничего не найдено.