UIPasteboard 无法多次复制具有过期时间的文本
UIPasteboard unable to copy text with expiration time multiple times
我打电话给:
UIPasteboard.general.setItems([[kUTTypePlainText as String: text]], options: [.localOnly: true, .expirationDate: expirationTime])
每次点击按钮复制文本。但是,过期时间(30 秒)后,复制功能将停止工作。在调试器中查看后,第二次(或之后)调用此行,UIPasteboard
中的 items
数组返回为空。为什么会这样? Lastpass 等其他应用程序允许多次复制文本并设置到期时间。
我有一种预感,这可能与所使用的密钥有关,有什么想法吗?
花了太多时间后,我无法弄清楚为什么 setItems(_:options:)
中的 expirationDate
选项对于该函数的后续使用不起作用。没有关于此的任何其他文档。这是一个我无法弄清楚的基本琐碎问题,或者是 API.
更复杂的问题
无论如何,我已经使用定时器实现了这个解决方案。这将适用于所有 iOS 版本,我们只是在 30 秒后清除 UIPasteboard 的项目数组。 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 复制功能,并通过我需要的静态函数进行简单使用。
我打电话给:
UIPasteboard.general.setItems([[kUTTypePlainText as String: text]], options: [.localOnly: true, .expirationDate: expirationTime])
每次点击按钮复制文本。但是,过期时间(30 秒)后,复制功能将停止工作。在调试器中查看后,第二次(或之后)调用此行,UIPasteboard
中的 items
数组返回为空。为什么会这样? Lastpass 等其他应用程序允许多次复制文本并设置到期时间。
我有一种预感,这可能与所使用的密钥有关,有什么想法吗?
花了太多时间后,我无法弄清楚为什么 setItems(_:options:)
中的 expirationDate
选项对于该函数的后续使用不起作用。没有关于此的任何其他文档。这是一个我无法弄清楚的基本琐碎问题,或者是 API.
无论如何,我已经使用定时器实现了这个解决方案。这将适用于所有 iOS 版本,我们只是在 30 秒后清除 UIPasteboard 的项目数组。 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 复制功能,并通过我需要的静态函数进行简单使用。