我打电话给:
UIPasteboard.general.setItems([[kUTTypePlainText as String: text]], options: [.localOnly: true, .expirationDate: expirationTime])
按钮点击复制文本。但是,在过期时间过去(30秒)后,复制功能将停止工作。查看调试器后,第二次(或之后)调用此行,items
中的UIPasteboard
数组返回为空。为什么会这样?其他应用程序(如Lastpass)允许在到期时间内多次复制文本。
我有预感,它可能与使用的密钥,任何想法有关?
花了太多时间后,我无法弄清楚为什么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复制功能,并通过我需要的静态函数简单使用。