UIPasteboard无法多次复制带有过期时间的文本

问题描述 投票:0回答:1

我打电话给:

UIPasteboard.general.setItems([[kUTTypePlainText as String: text]], options: [.localOnly: true, .expirationDate: expirationTime])

按钮点击复制文本。但是,在过期时间过去(30秒)后,复制功能将停止工作。查看调试器后,第二次(或之后)调用此行,items中的UIPasteboard数组返回为空。为什么会这样?其他应用程序(如Lastpass)允许在到期时间内多次复制文本。

我有预感,它可能与使用的密钥,任何想法有关?

ios swift clipboard uipasteboard pasteboard
1个回答
0
投票

花了太多时间后,我无法弄清楚为什么expirationDate中的setItems(_:options:)选项不能用于该功能的后续使用。没有任何其他文件。要么这是一个基本的微不足道的问题,我无法弄清楚,或者是API更复杂的问题。

无论如何,我已经使用Timer实现了这个解决方案。这适用于所有iOS版本,我们只需在30秒后清除UIPasteboard的items数组。 expirationDate选项仅适用于iOS 10.3及更高版本,而此功能更强大,适用于所有版本。

class MyPasteboard {
    private static let shared = MyPasteboard()
    private let pasteboard = UIPasteboard.general
    private var expirationTimer: Timer?

    private init() {}

    static func copyText(_ text: String, expirationTime: TimeInterval = 30) {
        shared.pasteboard.string = text
        shared.expirationTimer?.invalidate()
        shared.expirationTimer = Timer.scheduledTimer(
            timeInterval: expirationTime,
            target: self,
            selector: #selector(expireText),
            userInfo: nil,
            repeats: false
        )
    }

    @objc private static func expireText() {
        shared.expirationTimer = nil
        shared.pasteboard.items = []
    }
}

有许多不同的方法来构建这个,但我选择这样做,因为它允许我抽象出UIPasteboard复制功能,并通过我需要的静态函数简单使用。

© www.soinside.com 2019 - 2024. All rights reserved.