簡體   English   中英

顯示以編程方式創建的 UITextView/UITextField 的剪切/復制/粘貼菜單

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM