Swift 在UIViewControllerRepresentable中设置ViewController的属性
如何更改通过显示的Swift 在UIViewControllerRepresentable中设置ViewController的属性,swift,swiftui,Swift,Swiftui,如何更改通过显示的UIViewController上的属性。aUIViewControllerRepresentable 我希望它如何工作的示例代码,但是它没有。我怎样才能让它工作 (颜色只是一个例子,请不要关注这个) 类MyViewController:UIViewController{ 变量颜色:UIColor?=nil{ 迪塞特{ guard isViewLoaded else{return} view.layer.backgroundColor=颜色?.cgColor } } 重写fun
UIViewController
上的属性。aUIViewControllerRepresentable
我希望它如何工作的示例代码,但是它没有。我怎样才能让它工作
(颜色只是一个例子,请不要关注这个)
类MyViewController:UIViewController{
变量颜色:UIColor?=nil{
迪塞特{
guard isViewLoaded else{return}
view.layer.backgroundColor=颜色?.cgColor
}
}
重写func viewDidLoad(){
view.layer.backgroundColor=颜色?.cgColor
}
}
结构MyView:UIViewControllerRepresentable{
@国家私有var颜色:UIColor?
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->MyViewController{
让viewController=MyViewController()
viewController.color=color//是否始终为零?
返回视图控制器
}
func updateUIViewController(uUIViewController:MyViewController,
上下文:UIViewControllerRepresentableContext){
uiViewController.color=color//是否始终为零?
}
}
扩展MyView{
func color(color:UIColor)->MyView{
self.color=color//什么都不做?
回归自我
}
}
结构ContentView:View{
var body:一些观点{
MyView()
.颜色(.洋红)
}
}
这里是一种可能的方法(如果您希望颜色可以从外部修改,正如所见)。使用Xcode 11.4/iOS 13.4进行测试
struct MyView: UIViewControllerRepresentable {
@Binding var color: UIColor?
func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
let viewController = MyViewController()
viewController.color = color // always nil?
return viewController
}
func updateUIViewController(_ uiViewController: MyViewController,
context: UIViewControllerRepresentableContext<MyView>) {
uiViewController.color = color // always nil?
}
}
struct ContentView: View {
@State private var color: UIColor? = .magenta
var body: some View {
MyView(color: $color)
// MyView(color: .constant(.magenta)) // alternate usage
}
}
struct MyView:UIViewControllerRepresentable{
@绑定变量颜色:UIColor?
func makeUIViewController(上下文:UIViewControllerRepresentableContext)->MyViewController{
让viewController=MyViewController()
viewController.color=color//是否始终为零?
返回视图控制器
}
func updateUIViewController(uUIViewController:MyViewController,
上下文:UIViewControllerRepresentableContext){
uiViewController.color=color//是否始终为零?
}
}
结构ContentView:View{
@国家私有var颜色:UIColor?=.PIGENTA
var body:一些观点{
MyView(颜色:$color)
//MyView(颜色:。常量(.洋红))//其他用法
}
}
另一个基于Asperi回答中想法的解决方案:
struct MyView: UIViewControllerRepresentable {
private class State: ObservableObject {
var color: UIColor?
}
@Binding private var state: State
init() {
_state = .constant(State())
}
func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
return MyViewController()
}
func updateUIViewController(_ uiViewController: MyViewController,
context: UIViewControllerRepresentableContext<MyView>) {
uiViewController.color = state.color
}
}
extension MyView {
func color(_ color: UIColor) -> MyView {
self.state.color = color
return self
}
}
唉,这种方法需要在视图构造函数中初始化所有绑定。如果有多个绑定/属性,那将非常糟糕。如果可能的话,我真的很想避免这种情况。@ClausJørgensen,如果你想让它在
updateUIViewController
中可更新,你需要绑定或某种ObservedObject的变体。啊,这给了我一个主意。我可以为我想要的任何属性(视图状态)添加一个中间ObservedObject,并将其作为私有常量绑定,同时从函数更新该状态。
struct MyView: UIViewControllerRepresentable {
private class State: ObservableObject {
var color: UIColor?
}
@Binding private var state: State
init() {
_state = .constant(State())
}
func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
return MyViewController()
}
func updateUIViewController(_ uiViewController: MyViewController,
context: UIViewControllerRepresentableContext<MyView>) {
uiViewController.color = state.color
}
}
extension MyView {
func color(_ color: UIColor) -> MyView {
self.state.color = color
return self
}
}
struct MyView: UIViewControllerRepresentable {
@Binding private var viewController: MyViewController
init() {
_viewController = .constant(MyViewController())
}
func makeUIViewController(context: UIViewControllerRepresentableContext<MyView>) -> MyViewController {
return viewController
}
func updateUIViewController(_ uiViewController: MyViewController,
context: UIViewControllerRepresentableContext<MyView>) {
}
}
extension MyView {
func color(_ color: UIColor) -> MyView {
self.viewController.color = color
return self
}
}