[英]Disable cut, copy, paste on UITextField using IBInspectable
[英]Display cut / copy / paste menu for UITextView / UITextField created programmatically
与来自 Storyboard 相比,以编程方式创建 UITextView 或 UITextField 时,我似乎无法获得默认行为。
我将视图控制器中的文本视图实例化为这样的属性:
lazy var descriptionTextView: UITextView = {
let tv = UITextView(frame: .zero)
tv.font = UIFont.systemFont(ofSize: UIFont.systemFontSize)
tv.clipsToBounds = true
tv.layer.cornerRadius = 5.0
tv.layer.borderWidth = 0.25
tv.translatesAutoresizingMaskIntoConstraints = false
return tv
}()
在loadView
我将其添加到视图并配置自动布局。 它显示正确,所以这不是问题。
我的问题是,在该文本视图中选择文本时,我希望显示以下菜单(从故事板项目中截取的屏幕截图):
我所看到的只是菜单栏显示更正建议,如果选择了单个单词,或者在选择多个单词时甚至什么都不显示。 如何在我的程序化方法中获得相同的行为?
编辑:
下面是我将 textview 添加到视图的方法(简化了,我在这里省略了其他视图):
override func loadView() {
view = UIView()
view.backgroundColor = .white
view.addSubview(descriptionTextView)
NSLayoutConstraint.activate([
descriptionTextView.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor, constant: 12),
descriptionTextView.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor, constant: 24),
descriptionTextView.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor, constant: -24),
descriptionTextView.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -12)
])
}
当我在文本字段中选择一个单词时,我只会得到更正建议:
当我选择多个单词时,菜单根本没有弹出:
试试这个例子:
@objc func longPressEventHandler(sender: UILongPressGestureRecognizer) {
guard sender.state == .began,
let senderView = sender.view,
let superView = sender.view?.superview
else { return }
// Make responsiveView the window's first responder
senderView.becomeFirstResponder()
// Set up the shared UIMenuController
let cutMenuItem = UIMenuItem(title: "Cut", action: #selector(cutTapped))
let copyMenuItem = UIMenuItem(title: "Copy", action: #selector(copyTapped))
UIMenuController.shared.menuItems = [cutMenuItem, copyMenuItem]
// Tell the menu controller the first responder's frame and its super view
UIMenuController.shared.setTargetRect(senderView.frame, in: superView)
// Animate the menu onto view
UIMenuController.shared.setMenuVisible(true, animated: true)
}
原来我是通过错误地实现scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions)
引入问题的:
实际上我在设置window?.windowScene = windowScene
之前调用了makeKeyAndVisible()
。
似乎标准剪切/复制/粘贴菜单包含在该属性中...
因此,要澄清一下,这里的willConnectTo
与错误...:
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(frame: UIScreen.main.bounds)
let mainViewController = ProjectTableViewController()
let navigationController = UINavigationController()
navigationController.setViewControllers([mainViewController], animated: false)
window?.rootViewController = navigationController
window?.makeKeyAndVisible()
window?.windowScene = windowScene //that's too late... :-(
...这是工作代码:
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(frame: UIScreen.main.bounds)
let mainViewController = ProjectTableViewController()
let navigationController = UINavigationController()
navigationController.setViewControllers([mainViewController], animated: false)
window?.rootViewController = navigationController
window?.windowScene = windowScene //that's better :-)
window?.makeKeyAndVisible()
我知道:犯了多么愚蠢的错误-我希望我的回答可以帮助遇到此问题的任何其他人...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.