нажатие кнопки в представлении таблицы - PullRequest
0 голосов
/ 05 мая 2018

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

проблема в том, что кнопка не нажата, и нажата вся ячейка, и нужное мне действие никогда не произойдет!

как это решить? я хочу нажать на кнопку, а не на ячейку, и выполнять определенные действия при нажатии ..

вот что я делаю, но не работает ..

пользовательская ячейка:

 class CustomViewCell8: UITableViewCell {

var onButtonTapped : (() -> Void)? = nil
@IBOutlet weak var servicebtn: UIButton!

@IBAction func Clicked(_ sender: UIButton) {
    if let onButtonTapped = self.onButtonTapped{
        onButtonTapped()
    }
}

override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code
}


override func setSelected(_ selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

и в контроллере вида:

      func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableview.dequeueReusableCell(withIdentifier: "CustomCell8") as! CustomViewCell8
    cell.servicebtn.setBackgroundImage(UIImage(named: serviceimage[indexPath.row]) as UIImage?, for: UIControlState.normal)

    cell.onButtonTapped = {
        if self.number == 1 {
            if indexPath.row == 0{
                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let vc: UIViewController = storyboard.instantiateViewController(withIdentifier: " ") as UIViewController
                self.present(vc, animated: true, completion: nil)
                let userDefaults = UserDefaults.standard
                let decoded  = userDefaults.object(forKey: "services") as! Data
                let decodedService = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Service]

                for service in decodedService {
                    if service.name == " "{
                        GetShiftsAndPrices(id: service.id)
                    }
                }
            }else if indexPath.row == 1{
                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let vc: UIViewController = storyboard.instantiateViewController(withIdentifier: " ") as UIViewController
                self.present(vc, animated: true, completion: nil)
                let userDefaults = UserDefaults.standard
                let decoded  = userDefaults.object(forKey: "services") as! Data
                let decodedService = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Service]

                for service in decodedService {
                    if service.name == " "{
                        GetShiftsAndPrices(id: service.id)

                    }
                }
            }else if indexPath.row == 2{
                let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
                let vc: UIViewController = storyboard.instantiateViewController(withIdentifier: " ") as UIViewController
                self.present(vc, animated: true, completion: nil)
                let userDefaults = UserDefaults.standard
                let decoded  = userDefaults.object(forKey: "services") as! Data
                let decodedService = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Service]

                for service in decodedService {
                    if service.name == " "{
                        GetShiftsAndPrices(id: service.id)


                    }
                }
            }

       ......
    return cell
}

это работало со мной раньше ... но теперь не работает! я не знаю, что случилось .. я делаю что-то не так?

1 Ответ

0 голосов
/ 05 мая 2018

Вы указали, что даже print("here") в вашем @IBAction для кнопки не печатается. Вы также указали, что ваш @IBAction подключен правильно. Это означает, что есть проблема с вашей прототипной ячейкой. Если представление, содержащее кнопку, меньше, чем кнопка, вы не сможете щелкнуть ее. Проверьте макет вашей прототипа ячейки.

Оригинальный ответ

Похоже, это должно работать.

Три комментария:

  1. Вы должны добавить [unowned self] к вашему объявлению закрытия, чтобы избежать строгого цикла ссылок , который будет препятствовать освобождению UITableView. Так как клетка не переживет содержащую ее UITableView, нет необходимости в ней содержать сильную ссылку на self.

    cell.onButtonTapped = { [unowned self]
        if self.number == 1 {
        ...
    
  2. Вы можете использовать опциональную цепочку для замены:

    if let onButtonTapped = self.onButtonTapped{
       onButtonTapped()
    }
    

    просто:

    self.onButtonTapped?()
    
  3. Ваш код очень повторяется. Если единственная разница между строками - это идентификатор для следующего ViewController, то вы можете сделать:

    let nextvcid = ["foo", "bar", "baz"][indexPath.row]
    
    cell.onButtonTapped = { [unowned self]
        if self.number == 1 {
            let storyboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let vc: UIViewController = storyboard.instantiateViewController(withIdentifier: nextvcid)
            self.present(vc, animated: true, completion: nil)
            let userDefaults = UserDefaults.standard
            let decoded  = userDefaults.object(forKey: "services") as! Data
            let decodedService = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! [Service]
    
            for service in decodedService {
                if service.name == " "{
                    GetShiftsAndPrices(id: service.id)
                }
            }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...