【问题标题】:SwiftUI in ObjectiveC Project - List works in preview, not when it is runObjective C 项目中的 SwiftUI - 列表在预览中工作,而不是在运行时工作
【发布时间】:2022-01-18 17:06:19
【问题描述】:

我有一个非常大的objective-c 项目,正在尝试慢慢整合SwiftUI。我已经能够在从 Objective-c 类调用的 swiftUI 类中成功实现一些屏幕。

现在面临的一个奇怪错误是 List 在应用程序运行时不可见。虽然它在预览中可见。而且当我用 VStack 替换 List 时,运行应用程序时它看起来很好。如果我制作一个独立的 SwiftUI 应用程序并运行此代码,那么它也可以正常运行。只有当我从objective-c类调用这个类时才会出现问题。

附加图片

Xcode Preview Screenshot

Device Screenshot

代码


import SwiftUI

struct InfoShareView: View {
    var body: some View {
             List{
                    Text("First Line")
                    Text("Second Line")
            }
            .padding()
            .background(Color.white)
        }

}

struct InfoShareView_Previews: PreviewProvider {
    static var previews: some View {
        InfoShareView()
    }
}

这里是对 InfoShareView 的调用


import UIKit
import SwiftUI

class AboutViewControllerSwift: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        let swiftController = UIHostingController(rootView: InfoShareView())
        addChild(swiftController)

        swiftController.view.translatesAutoresizingMaskIntoConstraints  = false
        view.addSubview(swiftController.view)

        swiftController.view.centerXAnchor.constraint(equalTo: view.centerXAnchor).isActive = true
        swiftController.view.centerYAnchor.constraint(equalTo: view.centerYAnchor).isActive = true

     }


}

这是来自objective-c类的调用

AboutViewControllerSwift *aboutViewController = [[AboutViewControllerSwift alloc] initWithNibName:nil bundle:nil];
self.nvgController=[[UINavigationController alloc]initWithRootViewController:aboutViewController];
self.window.rootViewController=self.nvgController;
[self.window makeKeyAndVisible];

【问题讨论】:

    标签: objective-c swiftui swiftui-list


    【解决方案1】:

    我认为这是由于限制,尝试使用而不是跟随

        ...
        view.addSubview(swiftController.view)
    
        swiftController.view.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        swiftController.view.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        swiftController.view.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        swiftController.view.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    

    【讨论】:

      【解决方案2】:

      将此添加到 viewdidload 的最后一行对我有用:

      swiftController.view.frame = self.view.frame
      

      【讨论】:

        猜你喜欢
        • 2020-01-02
        • 2022-12-16
        • 2023-03-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-15
        • 1970-01-01
        相关资源
        最近更新 更多