Отправка анонимных действий с помощью UIApplication.sharedApplication(). SendAction в Swift 3
Я использую sendAction
метод с nil
target
сообщать действия от 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 кажется красивее, не так ли?:)