Отправка анонимных действий с помощью UIApplication.sharedApplication(). SendAction в Swift 3

Я использую sendAction метод с niltarget сообщать действия от Cells(UITableViewCell/UICollectionViewCell) в ViewControllersвместо реализации делегата.

Начиная с Swift 2.2, синтаксис для селектора был обновлен, и я получил некоторое предупреждение. Новый #selector синтаксис настаивает на указании selectorname с последующим classname, Если я упомяну имя класса, то нет смысла устанавливать в качестве цели значение nil.

Любой обходной путь для этого?

    class RedeemCell: UICollectionViewCell { 
    @IBAction func redeemAction(sender: AnyObject) {                 
      UIApplication.sharedApplication().sendAction("updateCartWithTotalAmountPayableWithDiscount:", to: nil, from: self, forEvent: nil)
        } 
    }

class CartVC: UIViewController {

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

        let cell: UICollectionViewCell?

            cell = collectionView.dequeueReusableCellWithReuseIdentifier("redeempoints", forIndexPath: indexPath)


        return cell!;
    }

func updateCartWithTotalAmountPayableWithDiscount(sender: AnyObject) {
        print("this will be called as the action movies through responderchain and encounters this method");
    }
}

3 ответа

Решение

Вы можете (и, вероятно, должны) пройти #selector(CartVC.updateCartWithTotalAmountPayableWithDiscount), Когда вы делаете это, вы говорите, что вы хотите селектор для updateCart... функция, которая CartVC класс определяет - в отличие от updateCart... функция, определенная некоторым другим классом.

Это отличается от значения прохождения nil как ваша цель - класс, который вы называете в #selector выражение уточняет, что сообщение вы хотите отправить, на основе класса, который его определяет. Цель о том, кому вы отправляете сообщение. Когда вы выбираете nil для цели, вы говорите, что сообщение должно идти к первому объекту, который может его обработать - это может быть одним из нескольких случаев CartVC или экземпляр другого класса, который принимает то же сообщение.

Ты можешь использовать Selector() создать селектор из строки в стиле Objective-C. Чтобы избежать предупреждения "Использовать #selector", используйте параметр, чтобы сохранить имя селектора и передать его Selector() вместо передачи строкового литерала напрямую.

let selectorName = "updateCartWithTotalAmountPayableWithDiscount:"
UIApplication.sharedApplication().sendAction(Selector(selectorName), to: nil, from: self, forEvent: nil)

Почему вы используете sendAction для этого вместо того, чтобы использовать что-то вроде NSNotificationCenter?

Слишком поздно для этого, но теперь вы должны определить протокол, который виден среде выполнения objective-c, и использовать этот протокол. Думаю, теперь UITableViewDelegate кажется красивее, не так ли?:)

Другие вопросы по тегам