У Apple есть частный API, который позволяет вам сделать это, однако, следует предупредить, что это может привести к тому, что ваше приложение будет отклонено из App Store, если вы не запутаете использование указанного API, используя что-то вроде Метод Swizzling. Вот шаги, чтобы сделать так:
Создать протокол под названием PrivateMethodRevealer
, который позволяет получить доступ к необходимой частному API, Apple, а именно те, чтобы показать и увольняют редактировать действия. Кредиты на this answer за предоставление этого метода предоставления частных API. Методы в протоколе объявляются как optional
, так что в случае, если Apple изменит имя метода, приложение не будет разбиваться, но скорее оно просто не покажет действия редактирования.
@objc protocol PrivateMethodRevealer {
optional func setShowingDeleteConfirmation(arg1: Bool)
optional func _endSwipeToDeleteRowDidDelete(arg1: Bool)
}
Следует отметить, что хотя методы относятся к delete
, это показывает все UITableViewRowAction
S, которые находятся на клетки.
Создайте функцию, которая обрабатывает показ и скрытие редактирования действий в вашем UITableViewCell
подкласса (если у вас есть), или создать метод в UITableViewCell
extension
. Я назову этот метод showActions
в демонстрационных целях.
Добавьте следующее тело к вашей функции:
func showActions() {
(superview?.superview as? AnyObject)?._endSwipeToDeleteRowDidDelete?(false)
(self as AnyObject).setShowingDeleteConfirmation?(true)
}
Это, во-первых увольняет действия редактирования любых видимых ячеек, позвонив по телефону _endSwipeToDeleteRowDidDelete:
на UITableView
(который SuperView SuperView в клетки), а затем показывает клетки собственные действия по редактированию (по телефону setShowingDeleteConfirmation:
). Обратите внимание, что нам нужно отклонить действия других ячеек, поскольку отображение нескольких строк с действиями редактирования крайне затруднительно.
Если вы хотите, вы также можете создать кнопку в UIViewController
, которая отклоняет любые редактируемые ячейки. Чтобы сделать это, просто вызовите следующий метод, где tableView
ваша ссылка на UITableView
:
(tableView as AnyObject)?._endSwipeToDeleteRowDidDelete?(false)
Если салфетки жесты между вашими UIPageViewController
и UITableViewCell
с конфликтуют, просто переопределить метод tableView:editingStyleForRowAtIndexPath:
вернуть .None
,
В конце концов, ваш код может произвести следующий результат
EDIT: Вот быстрый способ, чтобы скрыть использование вашего API с помощью метода swizzling. Кредиты для this website для обеспечения базовой реализации этого метода. Будьте предупреждены, что я не могу гарантировать, что он будет работать, так как это невозможно проверить в прямом эфире.
Для этого замените протоколы со следующим кодом, и везде, где вы звоните setShowingDeleteConfirmation(true)
или _endSwipeToDeleteRowDidDelete(false)
, замените его showRowActions()
и hideRowActions()
вместо этого. Однако этот метод имеет некоторые непреднамеренные эффекты, например, UITableViewCell
s не реагирует на взаимодействие пользователя, пока действия редактирования видны.
extension UITableViewCell {
func showRowActions(arg1: Bool = true) {}
public override static func initialize() {
struct Static {
static var token: dispatch_once_t = 0
}
guard self === UITableViewCell.self else {return}
dispatch_once(&Static.token) {
let hiddenString = String(":noitamrifnoCeteleDgniwohStes".characters.reverse())
let originalSelector = NSSelectorFromString(hiddenString)
let swizzledSelector = #selector(showRowActions(_:))
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
extension UITableView {
func hideRowActions(arg1: Bool = false) {}
public override static func initialize() {
struct Static {
static var token: dispatch_once_t = 0
}
guard self === UITableView.self else {return}
dispatch_once(&Static.token) {
let hiddenString = String(":eteleDdiDwoReteleDoTepiwSdne_".characters.reverse())
let originalSelector = NSSelectorFromString(hiddenString)
let swizzledSelector = #selector(hideRowActions(_:))
let originalMethod = class_getInstanceMethod(self, originalSelector)
let swizzledMethod = class_getInstanceMethod(self, swizzledSelector)
class_addMethod(self, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod))
method_exchangeImplementations(originalMethod, swizzledMethod)
}
}
}
Я тоже столкнулся с той же проблемой, вы получили какое-либо решение? , пожалуйста, поделитесь им с нами. – Rawan
@eng_rawan. Эта проблема еще не решена. – Firas
Вы нашли решение? @Firas –