我非常接近在 SwiftUI 中实现 UITextView 的动态高度。请帮我解决这些问题:
[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 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) 我试图在项目播放完毕后暂停我的 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) 我正在 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)