当列表加载网络数据的时候 最后一个元素无法打开详情页 当下拉到最底部的时候 再返回顶部 第一个元素也无法打开了
import SwiftUI
// 商品列表
struct GoodsListHttpServerResData:Codable { // 让这个数据结构 继承可解码的类 Codable
let code :Int // 状态码
let msg :String // 说明信息
let data:[Goods] // 列表数据
}
struct HomeView: View {
// 构造方法 生成界面的时候
init() {
UITableView.appearance().separatorStyle = .none // 去掉默认列表的 分割线
}
@State private var goodsListData = [Goods]()
var body: some View {
NavigationView {
List{
ForEach( self.goodsListData ,id: \.id ){ goods in
GoodsView(goods: goods) // 循环调用单个微博的函数
.listRowInsets(EdgeInsets()) // 列表里边的 每一个元素 上下左右的间距 为 0
}
}.onAppear(perform: httpGetGoodsList)
.navigationBarTitle(Text("首页"), displayMode: .inline)
}
}
func httpGetGoodsList() {
let url = URL(string: "http://www.cddtkabc.top/7.php")!
var request = URLRequest(url: url)
request.httpMethod = "GET"
// request.timeoutInterval = 15
// 创建请求任务
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
// 如果有错误
if let error = error {
// self.updateData(text: error.localizedDescription,isGoToLoginView: false)
print(error.localizedDescription)
return
}
// 判断状态码
guard let httpResponse = response as? HTTPURLResponse ,httpResponse.statusCode == 200 else{
print("服务端请求状态码非 200")
// self.updateData(text: "服务端请求状态码非 200",isGoToLoginView: false)
return
}
// 判断有么有数据
guard let data = data else{
print("服务端没有返回数据")
// self.updateData(text: "服务端没有返回数据",isGoToLoginView: false)
return
}
// 解析数据
guard let resData = try? JSONDecoder().decode(GoodsListHttpServerResData.self, from: data) else {
print("解析返回值失败")
// self.updateData(text: "解析返回值失败",isGoToLoginView: false)
return
}
if resData.code == 200 {
// self.updateData(text:resData.msg, isGoToLoginView:true)
print(resData)
DispatchQueue.main.async {
self.goodsListData = resData.data
}
}else{
// self.updateData(text:resData.msg, isGoToLoginView:true)
}
}
// 请求任务执行
task.resume()
}
func updateData( text: String , isGoToLoginView:Bool){
// 用主进程 修改数据
DispatchQueue.main.async {
// self.alertMsg = text
// self.isAlert = true
// self.isGoToLoginView = isGoToLoginView
}
}
}
struct HomeView_Previews: PreviewProvider {
static var previews: some View {
HomeView()
// .environmentObject(RootViewModel())
}
}
// GoodsView code:
import SwiftUI
struct GoodsView: View {
let goods:Goods
var body: some View {
VStack{
// 水平排列
HStack( spacing:10){
goods.goodsImage.resizable() // 图片缩放
.frame(width: 120, height: 120, alignment: .center) // 宽高
.cornerRadius(10) // 圆角
// 垂直排列
VStack(alignment: .leading, spacing: 10){
// 垂直排列
VStack(alignment: .leading, spacing: 5){
Text(goods.goods_name) // 创建文字视图
.font(.system(size:15)) // 设置系统字体
.foregroundColor(.black) // 设置颜色
.lineLimit(2) // 允许占用两行
// .padding(.top,5)
.frame(height: 40)
Text(goods.goods_info) // 创建文字视图
.font(.system(size:10)) // 设置系统字体
.foregroundColor(.black) // 设置颜色
}
VStack(alignment: .leading, spacing: 5){
// 水平排列
HStack(){
Text("¥")
.font(.system(size:10))
Text(String(goods.goods_price))
.font(.system(size:16))
}.foregroundColor(.red) // 设置颜色
Text("实体地址:" + goods.store_adress)
.font(.system(size:10)) // 设置系统字体
.foregroundColor(Color(red: 0, green: 0, blue: 0, opacity: 1)) // 设置颜色
Text("店铺名称:" + goods.store_name)
.font(.system(size:10)) // 设置系统字体
.foregroundColor(Color(red: 0, green: 0, blue: 0, opacity: 1)) // 设置颜色
}
Divider() //分割线
}
}.padding(.all,5)
}.navigationLink(destination:Text("1111"))
// }
}
}
struct GoodsView_Previews: PreviewProvider {
static var previews: some View {
GoodsView(goods: Goods(
id: 2000,
goods_name: "热卖苹果手机 2020 年新款 128G 全网通 5G 手机",
goods_info: "商品描述商品描述商品描述商品描述商品描述商品描述",
goods_price: 5999.99,
goods_stock: 100,
goods_images: [
"ceqdFM0zXxTc.jpg",
"ceUaxg4en3tY.jpg",
"ceyQj7HJ0oVhc.jpg",
],
store_name: "京东自营礼物店",
store_adress: "山东省济南市天桥区凤凰广场"
))
// GoodsView(goods: goodsList.list[0])
}
}
swiftui swiftui-导航链接
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.