小编atd*_*nsm的帖子

如何在 SwiftUI 中获取 UITextView 的动态高度

我非常接近在 SwiftUI 中实现 UITextView 的动态高度。请帮我解决这些问题:

  1. UITextView 在出现时具有正确的高度,但在执行编辑时不会调整高度;我希望它能调整一下。
  2. 每次我在 TextView 中编辑文本时,我都会在控制台中收到此消息:[SwiftUI] Modifying state during view update, this will cause undefined behavior.

这是我的代码:

项目编辑视图

TextView(text: $notes, textViewHeight: $textViewHeight)
    .frame(height: self.textViewHeight)
Run Code Online (Sandbox Code Playgroud)

UI文本视图

import SwiftUI

struct TextView: UIViewRepresentable {
    @Binding var text: String
    @Binding var textViewHeight: CGFloat

    func makeUIView(context: Context) -> UITextView {
        let textView = UITextView()
        textView.delegate = context.coordinator
        textView.font = .systemFont(ofSize: 17)
        textView.backgroundColor = .clear

        return textView
    }

    func updateUIView(_ textView: UITextView, context: Context) {
        textView.text = text
    }

    class Coordinator: …
Run Code Online (Sandbox Code Playgroud)

swiftui uiviewrepresentable

6
推荐指数
1
解决办法
5208
查看次数

SwiftUI 2.0 / Xcode 12 中父视图和子视图的警报

有人可以向我解释为什么这在 SwiftUI 2.0 / iOS 14 / Xcode 12 中不起作用以及有效的解决方法吗?AlertOne 工作正常,但 AlertTwo 不行。我正在尝试对父视图和子视图(嵌套)发出警报。如果需要,您可以将其插入 Xcode 进行测试。谢谢。

import SwiftUI

struct ContentView: View {
    @State private var alertOne = false

    var body: some View {
        VStack {
            Button("Alert One") {
                self.alertOne.toggle()
            }
            TestView().padding()
        }
        .alert(isPresented: $alertOne) {
            Alert(title: Text("Alert One"), dismissButton: .default(Text("Got it!")))
        }
    }
}

struct TestView: View {
    @State private var alertTwo = false
    
    var body: some View {
        Button("Alert Two") {
            self.alertTwo.toggle()
        }
        .alert(isPresented: $alertTwo) {
            Alert(title: Text("Alert Two"), dismissButton: …
Run Code Online (Sandbox Code Playgroud)

alert swiftui

5
推荐指数
1
解决办法
1407
查看次数

与 SwiftUI/AVPlayer 中的通知中心/组合作斗争

我试图在项目播放完毕后暂停我的 AVPlayer。使用 SwiftUI 执行此操作的最佳方法是什么?我对通知、在哪里声明它们等不太了解。有没有办法使用组合来实现这一点?示例代码会很棒!先感谢您。

更新:

在下面答案的帮助下,我成功创建了一个类,该类采用 AVPlayer 并在项目结束时发布通知。您可以通过以下方式订阅通知:

班级:

import Combine
import AVFoundation

class PlayerFinishedObserver {

    let publisher = PassthroughSubject<Void, Never>()

    init(player: AVPlayer) {
        let item = player.currentItem

        var cancellable: AnyCancellable?
        cancellable = NotificationCenter.default.publisher(for: .AVPlayerItemDidPlayToEndTime, object: item).sink { [weak self] change in
            self?.publisher.send()
            print("Gotcha")
            cancellable?.cancel()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

添加到您的结构中:

let finishedObserver: PlayerFinishedObserver
Run Code Online (Sandbox Code Playgroud)

订阅某些视图:

.onReceive(finishedObserver.publisher) {
                print("Gotcha!")
            }
Run Code Online (Sandbox Code Playgroud)

avplayer notificationcenter swift swiftui combine

3
推荐指数
1
解决办法
4570
查看次数

SwiftUI 与 AVPlayer 结合使用 .onReceive 通知

我正在 SwiftUI 中工作,并且有一个 AudioPlayer 类型,它是 AVPlayer 的子类;它发布 AVPlayer 的 timeControllerStatus(?) (.playing、.paused 和其他?)。我不想子类化 AVPlayer,而是想传递一个 AVPlayer 并让它在某些视图中使用 .onReceive 通知我。这是我当前的功能类型:

import AVKit
import Combine

class AudioPlayer: AVPlayer, ObservableObject {
    @Published var buffering: Bool = false

    override init() {
        super.init()
        registerObservers()
    }

    private func registerObservers() {
        self.addObserver(self, forKeyPath: "timeControlStatus", options: [.old, .new], context: nil)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {

        if keyPath == "timeControlStatus", let change = change, let newValue = change[NSKeyValueChangeKey.newKey] as? Int, …
Run Code Online (Sandbox Code Playgroud)

notifications avplayer swift swiftui combine

3
推荐指数
1
解决办法
3704
查看次数