【问题标题】:Can't show the whole string in a list using SwiftUI无法使用 SwiftUI 在列表中显示整个字符串
【发布时间】:2021-07-12 07:17:25
【问题描述】:

当你打开sample project:

先按一行,会出现一个加号按钮。点击一次加号按钮后,将在行中附加一个加号。如果我多次点击按钮,++++ 字符串将显示+...(如下图所示)。我没想到会这样,我希望行高会自动增加,因此可以显示整个字符串。我该怎么做才能解决它?

如果我点击加号按钮 5-6 次,行高将按预期自动增加。

主要项目代码在sample project:

ContentView.swift

struct ContentView: View {
    
    @EnvironmentObject var userData: UserData
    
    var body: some View {

        HStack {
            List {
                ForEach(userData.subtasks) { subtask in
                    SubtaskRowNextToCard(subtaskModel: subtask)
                }
            }
            
            if userData.currentSubtask != nil {
                SubtaskCard()
                    .padding(.all)
            }
        }
        .onAppear {
                        
            for _ in 0..<20 {
                appendASubtask()
            }
            
        }
        
    }
    
    func appendASubtask() {
        let aSubtask = SubtaskModel(
        score: ""
        )
        
        userData.subtasks.append(aSubtask)
    }
    
}

SubtaskModel.swift

import Foundation
import SwiftUI

class SubtaskModel: ObservableObject, Identifiable {
    @Published var score: String = ""
    
    init(
        score: String
    ) {
        self.score = score
    }
}

SubtaskRowNextToCard.swift

struct SubtaskRowNextToCard: View {
    
    @ObservedObject var subtaskModel: SubtaskModel
    @EnvironmentObject var userData: UserData
    
    @State var scoreWithRound: String = ""
    
    var body: some View {
        
        Button(action: {
            userData.currentSubtask = subtaskModel
        }) {
            Text(scoreWithRound)
        }
        .onAppear {
            updateScore()
        }
        .onReceive(NotificationCenter.default.publisher(for: NSNotification.Name.init("changedCurrentSubtask"))) { obj in
            updateScore()
        }
        
    }
    
    func updateScore() {
        scoreWithRound = subtaskModel.score
    }
    
}

SubtaskCard.swift

struct SubtaskCard: View {
    
    @EnvironmentObject var userData: UserData
        
    var body: some View {
        
        Button(action: {
            print("+ button was tapped")
            appendScore(newScore: "+")
        }) {
            Image(systemName: "plus.circle.fill")
        }
        .buttonStyle(PlainButtonStyle())
        
    }
    
    func appendScore(newScore: String) {
        if let subtaskModel = userData.currentSubtask {
            subtaskModel.score = subtaskModel.score + newScore + " "
                        
            NotificationCenter.default.post(name: NSNotification.Name.init("changedCurrentSubtask"), object: nil, userInfo: nil)
        }
    }
}

【问题讨论】:

    标签: ios swift swiftui swiftui-list


    【解决方案1】:

    添加.fixedSize(horizontal: false, vertical: true),它将不再截断文本:

      ForEach(userData.subtasks) { subtask in
                        SubtaskRowNextToCard(subtaskModel: subtask).fixedSize(horizontal: false, vertical: true)
                    }
    

    编辑: 对于动态高度修复:

    Text 替换为TextEditor,您不会注意到闪烁:

    Text(scoreWithRound)
    

    TextEditor(text: $scoreWithRound).allowsHitTesting(false)
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多