SwiftUI - 有没有办法创建一个只读的 TextEditor?

Posted

技术标签:

【中文标题】SwiftUI - 有没有办法创建一个只读的 TextEditor?【英文标题】:SwiftUI - Is there a way to create a read-only TextEditor? 【发布时间】:2020-12-01 15:25:50 【问题描述】:

我在 SwiftUI 中使用 TextEditor 来显示长文本的内容。

我希望这是只读的,但只要我点击它,键盘就会弹出。

有没有办法将 TextEditor 设为只读,并且当用户点击它时看不到键盘?

我尝试过.disabled(),但这并不好,因为它会阻止控制器滚动,而且就像我说的那样,控制器包含长文本。

Text 不好,因为它不滚动。

【问题讨论】:

你为什么不用Text 文本不滚动,就像我说的,显示的文本很长。 TextEditor 似乎没有提供“不可编辑”状态。您可以使用 A) 滚动 Text 或 B) UITextView 滚动文本?如何?文本似乎没有滚动。 【参考方案1】:

非常基本的滚动文本示例:

struct ContentView: View 
    @State var content = "Long text here..."

    var body: some View 
        ScrollView 
            VStack 
                Text(content)
                    .lineLimit(nil)
            .frame(maxWidth: .infinity)
        
    

这是一个带有一些长文本的示例:

import SwiftUI

struct ContentView: View 
    @State var content =
        """
    Label

    A label can contain an arbitrary amount of text, but UILabel may shrink, wrap, or truncate the text, depending on the size of the bounding rectangle and properties you set. You can control the font, text color, alignment, highlighting, and shadowing of the text in the label.

    Button

    You can set the title, image, and other appearance properties of a button. In addition, you can specify a different appearance for each button state.

    Segmented Control
    
    The segments can represent single or multiple selection, or a list of commands.
    
    Each segment can display text or an image, but not both.
    
    Text Field
    
    Displays a rounded rectangle that can contain editable text. When a user taps a text field, a keyboard appears; when a user taps Return in the keyboard, the keyboard disappears and the text field can handle the input in an application-specific way. UITextField supports overlay views to display additional information, such as a bookmarks icon. UITextField also provides a clear text control a user taps to erase the contents of the text field.

    Slider
    
    UISlider displays a horizontal bar, called a track, that represents a range of values. The current value is shown by the position of an indicator, or thumb. A user selects a value by sliding the thumb along the track. You can customize the appearance of both the track and the thumb.
    
    Switch
    
    Displays an element that shows the user the boolean state of a given value.  By tapping the control, the state can be toggled.

    Activity Indicator View
    
    Used to indicate processing for a task with unknown completion percentage.
    
    Progress View
    
    Shows that a lengthy task is underway, and indicates the percentage of the task that has been completed.

    Page Control
    
    UIPageControl indicates the number of open pages in an application by displaying a dot for each open page. The dot that corresponds to the currently viewed page is highlighted. UIPageControl supports navigation by sending the delegate an event when a user taps to the right or to the left of the currently highlighted dot.
    
    Stepper
    
    Often combined with a label or text field to show the value being incremented.

    Horizontal Stack View
    
    An UIStackView creates and manages the constraints necessary to create horizontal or vertical stacks of views. It will dynamically add and remove its constraints to react to views being removed or added to its stack. With customization it can also react and influence the layout around it.
    
    Vertical Stack View
    
    An UIStackView creates and manages the constraints necessary to create horizontal or vertical stacks of views. It will dynamically add and remove its constraints to react to views being removed or added to its stack. With customization it can also react and influence the layout around it.

    Table View
    
    Coordinates with a data source and delegate to display a scrollable list of rows. Each row in a table view is a UITableViewCell object.
    
    The rows can be grouped into sections, and the sections can optionally have headers and footers.
    
    The user can edit a table by inserting, deleting, and reordering table cells.
    
    Table View Cell
    
    Defines the attributes and behavior of cells in a table view. You can set a table cell's selected-state appearance, support editing functionality, display accessory views (such as a switch control), and specify background appearance and content indentation.

    Image View
    
    Shows an image, or series of images as an animation.
    
    Collection View
    
    Coordinates with a data source and delegate to display a scrollable collection of cells. Each cell in a collection view is a UICollectionViewCell object.
    
    Collection views support flow layout as well a custom layouts, and cells can be grouped into sections, and the sections and cells can optionally have supplementary views.
    """
    
    var body: some View 
        ScrollView 
            VStack 
                Text(content)
                    .lineLimit(nil)
            .frame(maxWidth: .infinity)
        
    


struct ContentView_Previews: PreviewProvider 
    static var previews: some View 
        ContentView()
    

【讨论】:

看起来很难 + 这不是 TextEditor,这是对 TextEditor 的模仿,即使没有 textEditor 的 stile :) 像我的回答一样更容易使用假绑定【参考方案2】:

DonMag's solution 无法选择文本。相反,只需使用.constant(...)

TextEditor(text: .constant(self.text))

【讨论】:

【参考方案3】:

2021 | SwiftUI 2

像魅力一样轻松!


方式 1:假绑定

    创建文本变量 创建假绑定
let text: String
var textBind: Binding<String>  Binding(get:  text , set:  _ in ) 


//usage:
TextEditor(text: textBind )

结果 - 只读文本编辑器。


方式二:Introspect

TextEditor(text: $text )
    .introspectTextView $0.isEditable = false 

【讨论】:

以上是关于SwiftUI - 有没有办法创建一个只读的 TextEditor?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在 SwiftUI 中创建一个新的手势?

有没有办法为 SwiftUI 菜单使用 .displayInline 选项?

如何在 SwiftUI 中为列表创建标题?

如何使用 swiftui 创建表情符号键盘?

SwiftUi 有没有办法在 TextField 中获取文本

SwiftUI点击任意文本在只读与可编辑之间随意切换的实现