Как передать sender.tag кнопки другому VC при нажатии на кнопку, которая вызывает открытие другого VC - PullRequest
0 голосов
/ 19 сентября 2019

Я использую пользовательскую ячейку tableView, в которой есть кнопка и несколько меток в VC1.Что я хочу сделать, так это когда я нажимаю кнопку в строке, затем открываю VC2 и отправляю текст текущей метки (names [i]) в VC2.

Но в моем случае я застрял в том, как передатьbuttonTag в прессеButton func, чтобы подготовить func controller.playingSong = names[buttonTag].Я пытаюсь использовать глобальную переменную var, затем каждый раз prepare () извлекает эту переменную, но это свойство не работает, кажется, что prepare () будет выполняться перед методом pressButton ().

Что ж, я много ищу, но не нашел решения. Могу ли я объединить prepare () с моей pressButton (), другими словами, необходима ли подготовка при использовании segue?

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var myTableView: UITableView!
    let REUSE_ID = "CustomCell"
    var names = ["first", "second", "third"]

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
    }

    @IBAction func pressButton(_ sender: UIButton) {
        let buttonTag = sender.tag
    }

}

extension ViewController: UITableViewDataSource, UITableViewDelegate {
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return names.count
    }


    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: REUSE_ID, for: indexPath) as! CustomCell

        cell.myButton.tag = indexPath.row
        cell.songName.text = names[indexPath.row]
        // cell.myButton.addTarget(self, action: #selector(self.pressButton(_:)), for: .touchUpInside)

        return cell
    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        switch segue.identifier {
            case "playingSongs":
                let controller = segue.destination as! OpenedVC
                controller.playingSong = names[buttonTag]
            default: break
        }
    }
}

Ответы [ 3 ]

0 голосов
/ 19 сентября 2019

Вам не обязательно переопределять функцию подготовки.

Просто напишите вместо этого код функции подготовки в функции pressButton, но с небольшими изменениями, например:

 @IBAction func pressButton(_ sender: UIButton) {

                let controller = self.storyboard?.instantiateViewController(withIdentifier: "YourView's StoryBoardID") as! OpenedVC
                controller.playingSong = names[sender.tag]
                present(viewControllerToPresent: controller, animated: true, completion: nil)

            }

Надеюсь, мой ответ поможет вам:)

0 голосов
/ 19 сентября 2019

Вам нужно изменить здесь, если "segue is from Button"

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch segue.identifier {
    case "playingSongs":
        let controller = segue.destination as! ViewController
        controller.playingSong = names[(sender as! UIButton).tag] //Need Change here
    default: break
    }
}
0 голосов
/ 19 сентября 2019

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

Если ваше нажатие кнопки вызывает IBAction, вы можете получить тег кнопки из параметра отправителя вдействие, а затем ваш код IBAction создает экземпляр контроллера представления и устанавливает свойство контроллера представления для тега отправителя перед его отображением.

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

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    switch segue.identifier {
        case "playingSongs":
            if let sendingButton = sender as? UIButton,
               let controller = segue.destination as? OpenedVC { //Don't use a force-cast
                 let buttonTag = sendingButton.tag
                 controller.playingSong = names[buttonTag]
            }
        // The rest of your code to follow
     }
}

РЕДАКТИРОВАТЬ:

Я исправил приведенный выше код, изменив два приведения в необязательной привязке if let для использования as?.

Обратите внимание, что вам следует избегать принудительного приведения (as!), поскольку в случае сбоя он вызывает сбой.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...