You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在SwiftUI中添加一键唤起Format面板的键盘工具栏按钮

实现点击键盘工具栏按钮直接唤起Format面板

要实现类似Apple Notes的一键唤起Format面板功能,核心是利用UITextView的showTextStyleOptions(_:)方法,直接调出系统格式面板,无需经过「更多」步骤。以下是优化后的完整代码:

修改后的ViewController代码

import UIKit
import SwiftUI

class ViewController: UIViewController {
    var text: String = "Implementing a Rich Text Editor has become a nightmare for iOS developers so far. Finally Apple announced an exciting update to UITextView for rich text editing."
    weak var textView: UITextView!

    override func viewDidLoad() {
        super.viewDidLoad()
        setupTextView()
        setupKeyboardToolbar()
    }
    
    private func setupTextView() {
        let textView = UITextView(frame: view.bounds.inset(by: UIEdgeInsets(top: 20, left: 16, bottom: 20, right: 16)))
        textView.font = .systemFont(ofSize: 21)
        textView.borderStyle = .none
        textView.allowsEditingTextAttributes = true
        textView.text = text
        view.addSubview(textView)
        self.textView = textView
    }
    
    private func setupKeyboardToolbar() {
        let toolbar = UIToolbar(frame: CGRect(x: 0, y: 0, width: view.frame.width, height: 44))
        toolbar.barStyle = .default
        
        let formatButton = UIBarButtonItem(title: "格式", style: .plain, target: self, action: #selector(showFormatPanel))
        let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
        
        toolbar.items = [flexibleSpace, formatButton, flexibleSpace]
        toolbar.sizeToFit()
        
        textView.inputAccessoryView = toolbar
    }
    
    @objc private func showFormatPanel() {
        // 直接唤起系统Format面板
        textView.showTextStyleOptions(.init())
    }
    
    func updateTextView(text: String) {
        textView.text = text
    }
}

#Preview {
    ViewController()
}

关键说明

  • 键盘工具栏设置:通过setupKeyboardToolbar创建包含「格式」按钮的工具栏,并将其设为textView的inputAccessoryView,使其随键盘一起显示
  • 直接唤起格式面板:点击按钮时调用textView.showTextStyleOptions(_:),这是iOS 16+提供的API,可直接调出系统格式面板,跳过默认的「更多」步骤
  • 前提条件:必须确保textView.allowsEditingTextAttributes设为true,否则无法启用富文本编辑及格式面板功能

保留原SimpleTextView代码

import SwiftUI
import UIKit

struct SimpleTextView: UIViewControllerRepresentable {
    @Binding var text: String
    
    func makeUIViewController(context: Context) -> ViewController {
        let viewController = ViewController()
        viewController.text = text
        return viewController
    }

    func updateUIViewController(_ uiViewController: ViewController, context: Context) {
        uiViewController.updateTextView(text: text)
    }
}

内容的提问来源于stack exchange,提问作者Lion

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 22:23:25