Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Если вы хотите, чтобы кнопка запускала переход 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)
}

Ответ 2

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

Ответ 3

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

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

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