Swift: сделать кнопку триггера на новую сцену

18

Хорошо, поэтому у меня есть сценарий TableView , и я собираюсь поместить кнопку в каждую из ячеек, и мне нужно, чтобы каждая ячейка, когда была нажата, segue в свою собственную сцену ViewController . Другими словами, мне нужно знать, как подключить кнопку к сцене (единственная кнопка, которую я имею сейчас, это «молоко»)

Я знаю, как создать IBAction , связанную с кнопкой, но что бы я добавил в IBAction ?

Я начинающий, поэтому мне нужно пошаговое объяснение здесь. Я включил изображение моей раскадровки. Я еще не написал никакого кода.

    
задан skyguy 28.09.2014 в 21:55
источник

3 ответа

30

Если вы хотите, чтобы кнопка запускала переход segue, проще всего нажать Control + Click с кнопки на контроллер вида и выбрать опцию Segue (например, push). Это закрепит его в IB для вас.

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

V2

@IBAction func about(sender: AnyObject) {
    performSegueWithIdentifier("about", sender: sender)
}

V3

@IBAction func about(_ sender: Any) {
    performSegue(withIdentifier: "about", sender: sender)
}
    
ответ дан AlBlue 28.09.2014 в 22:07
источник
  • Хорошо, я нажал кнопку управления, и теперь, когда я нажимаю кнопку, приложение падает на первой строке AppDelegate с помощью "SIGABRT" –  skyguy 28.09.2014 в 22:16
  • Ничего, что я получил –  skyguy 28.09.2014 в 23:06
  • Я думаю, что это должен быть self.performSegueWithIdentifier ("about", отправитель: отправитель) –  Mehmet 22.06.2015 в 14:55
13

Вы можете использовать шаблон делегирования . Предполагая, что вы внедрили пользовательскую ячейку таблицы, вы можете определить свойство в своем классе для хранения того, что, по вашему мнению, полезно для определения строки - это может быть ее индекс или (мой предпочтительный способ) экземпляр класса, который представляет собой данные, отображаемые в ячейке (я называю это MyCellData .

Идея состоит в том, чтобы позволить ячейке уведомить контроллер табличного представления о касании этой кнопки, передавая соответствующие данные (данные, отображаемые в) в строке. Затем контроллер табличного представления запускает segue, а в переопределенном prepareForSegue метод сохраняет данные, переданные ячейкой контроллеру назначения. Таким образом, если вам нужно отобразить подробные данные о строке, у вас есть вся необходимая информация, например сама информация о деталях, или идентификатор, который контроллер доступа может использовать для извлечения данных, например, из локальной базы данных или удаленной службы .

Определите протокол:

protocol MyCellDelegate {
    func didTapMilk(data: MyCellData)
}

затем объявите свойство с именем delegate в классе ячеек и вызовите его метод didTapMilk из IBAction

class MyTableCell : UITableViewCell {
    var delegate: MyCellDelegate?
    var data: MyCellData!

    @IBAction func didTapMilk() {
        if let delegate = self.delegate {
            delegate.didTapMilk(self.data)
        }
    }
}

Далее, выполните протокол в контроллере табличного представления, а также переопределите prepareForSegue

extension MyTableViewController : MyCellDelegate {
    func didTapMilk(data: MyCellData) {
        performSegueWithIdentifier("mySegueId", sender: data)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {
        if segue.identifier == "mySegueId" {
            let vc: MyDestinationViewController = segue.destinationViewController as MyDestinationViewController
            vc.data = sender as? MyCellData
        }
    }
}

Конечно, вам нужно свойство data на вашем контроллере представления назначения для этого. Как уже упоминалось выше, если он показывает информацию о строке, вы можете вставить все необходимые данные в свой класс MyCellData или, по крайней мере, то, что вам нужно, чтобы получить данные из любого источника (например, локальный БД, удаленный сервис и т. д.).

Наконец, в cellForRowAtIndexPath сохраните данные в ячейке и установите для свойства delegate значение self :

extension MyTableViewController : UITableViewDataSource {
    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let data: MyCellData = retrieveDataForCell(indexPath.row) // Retrieve the data to pass to the cell
        let cell = self.tableView.dequeueReusableCellWithIdentifier("myCellIdentifier") as MyTableCell
        cell.data = data
        cell.delegate = self

        // ... other initializations

        return cell
    }
}
    
ответ дан Antonio 28.09.2014 в 22:41
источник
0

Используйте self.performSegueWithIdentifier("yourViewSegue", sender: sender) под своим событием для обращения к нажатию кнопки:

@IBAction func redButtonClicked(sender: AnyObject) {
    self.performSegueWithIdentifier("redView", sender: sender)
}

В приведенном выше коде redView является идентификатором segue.

    
ответ дан Aks 23.07.2016 в 23:57
источник