gpt4 book ai didi

ios - 以编程方式打开 UITableView 编辑操作按钮

转载 作者:IT王子 更新时间:2023-10-29 05:05:29 27 4
gpt4 key购买 nike

我有一个 UIPageViewController,里面有 UITableViewControllers,向左滑动手势在 UIPageViewController 之间发生冲突,无法在 View 和 View 之间切换UITableViewCells 手势打开编辑操作,因此我需要在单元格中单击某个按钮时显示编辑操作。

我的问题是我能否以编程方式显示编辑操作按钮而不是在滑动手势上显示它们?

最佳答案

Apple 有一个私有(private) API 可以让您执行此操作,但是请注意,这可能会使您的应用程序被 App Store 拒绝,除非您使用类似Method Swizzling 的方法混淆所述 API 的使用。以下是执行此操作的步骤:

  1. 创建一个名为 PrivateMethodRevealer 的协议(protocol),让您可以访问所需的私有(private) Apple API,即显示和取消编辑操作的 API。归功于 this answer提供这种公开私有(private) API 的方法。协议(protocol)中的方法被声明为可选,这样即使 Apple 更改了方法的名称,应用也不会崩溃,只是不会显示编辑操作。

    @objc protocol PrivateMethodRevealer {
    optional func setShowingDeleteConfirmation(arg1: Bool)
    optional func _endSwipeToDeleteRowDidDelete(arg1: Bool)
    }

    请注意,虽然这些方法引用了delete,但这显示了单元格上的所有 UITableViewRowAction

  2. 在您的 UITableViewCell 子类(如果有的话)中创建一个函数来处理编辑操作的显示和隐藏,或者在 UITableViewCell 中创建该方法> 扩展名。出于演示目的,我将此方法命名为 showActions

  3. 将以下主体添加到您的函数中:

    func showActions() {
    (superview?.superview as? AnyObject)?._endSwipeToDeleteRowDidDelete?(false)
    (self as AnyObject).setShowingDeleteConfirmation?(true)
    }

    这首先通过在 UITableView(这是单元格的父 View 的父 View )上调用 _endSwipeToDeleteRowDidDelete: 来消除任何可见单元格的编辑操作,然后显示单元格自己的编辑操作(通过调用 setShowingDeleteConfirmation:)。请注意,我们需要关闭其他单元格的操作,因为显示多行具有编辑操作是非常错误的。

  4. 如果需要,您还可以在 UIViewController 中创建一个按钮,用于关闭任何当前正在编辑的单元格。为此,只需调用以下方法,其中 tableView 是您对 UITableView 的引用:

    (tableView as AnyObject)?._endSwipeToDeleteRowDidDelete?(false)

如果您的 UIPageViewControllerUITableViewCell 之间的滑动手势有冲突,只需覆盖 tableView:editingStyleForRowAtIndexPath: 方法以返回 .无

最后,您的代码可能会产生以下结果 Demo video

编辑:这是使用方法调配隐藏 API 使用的快速方法。归功于 this website用于提供此方法的基本实现。请注意,我无法保证它一定会起作用,因为无法对其进行现场测试。

为此,将协议(protocol)替换为以下代码,无论您调用 setShowingDeleteConfirmation(true) 还是 _endSwipeToDeleteRowDidDelete(false),都将其替换为 showRowActions ()hideRowActions() 代替。然而,此方法似乎有一些意想不到的效果,例如 UITableViewCell 在编辑操作可见时不响应用户交互。

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)
}
}
}

关于ios - 以编程方式打开 UITableView 编辑操作按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31543832/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com