微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SwiftUI,无法通过带有 PageTabViewStyle 的 URL 加载图像

如何解决SwiftUI,无法通过带有 PageTabViewStyle 的 URL 加载图像

嗨,我正在努力解决无法在 TabView 中加载图像的问题

我想进行页面视图,所以我尝试使用 TabView() 和 PageTabViewStyle。

我还使用 KingFisher 库通过 URL 加载图像。

当我编写如下代码时,此代码不起作用。 :

TabView() {
        KFImage(URL(string: <ADDRESS for IMAGE>)!)
               .resizable()
               .clipped()
               .frame(width: width_screen,height: height_banner,alignment: .topLeading)
    }
    .tabViewStyle(PageTabViewStyle(indexdisplayMode: .never))

我对 KFImage 有疑问,但如果 KFImage 范围在 TabView() 之外,它运行良好。当我编写如下代码时,它运行良好。

var body: some View {
    TabView() {
        ...
    }

    KFImage(URL(string: "<ADDRESS for IMAGE>")!)
                        .resizable()
                        .clipped()
                        .frame(width: width_screen,alignment: .topLeading)
}

我想知道如何在此 tabview 中显示图像。或者我应该构建自定义视图来制作分页视图。

解决方法

我认为这是关于异步操作的。我想出了这个解决方案;

在视图中:

@State private var image: UIImage? = nil

在正文中:

TabView() {
        Image(uiImage: image ?? UIImage(named: "defaultImage")!)
            .resizable()
            .clipped()
            .frame(width: 250,height:200,alignment: .topLeading)
            .onAppear(perform: {
                fetchImage()
            })
            
        }
        .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))

*我使用了"UIImage(named: "defaultImage")!"和“width: 250,height:200”,但你可以用你的替换它们。

在视图中:

    private func fetchImage() {
    if let url = URL(string: imageUrl) {
        KingfisherManager.shared.retrieveImage(with: url) { result in
            let image = try? result.get().image
            if let image = image {
                self.image = image
            }
        }
    }
}

另一种不使用 Kingfisher 的解决方案是这样的;

    TabView() {
        if let url = URL(string: imageUrl) {
            if let imageData: NSData = NSData(contentsOf: url) {
                if let image = UIImage(data: imageData as Data) {
                    Image(uiImage: image)
                        .resizable()
                        .clipped()
                        .frame(width: 250,alignment: .topLeading)
                }
            }
        }
    }
    .tabViewStyle(PageTabViewStyle(indexDisplayMode: .never))

效果很好。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?