MJRefresh中mj_reloadData方法死循环的问题

项目中用到MJRefresh来刷新数据,昨天在iOS9上的iPhone5s上测试项目的时候崩溃了。打开调试发现在MJRefresh库中的mj_reloadData方法死循环,改用iOS11的iPhone7测试却没有出现。

应该iOS9的问题,网上找的一些答案有说是因为库冲突导致reload被methodSwizzling 了两次,建议把其中一个methodSwizzling去掉。以下是MJRefresh作者回复:

在下一个版本,我可能会让automaticllyHidden完全失效。如果现在继续解决,可以先把以下2个load方法注释掉,但automaticllyHidden = YES会失效

 

需要把库从pod中删除,手动添加到项目,然后修改。我改了之后还是不行,因为有好几个库有替换方法,感觉修改起来很麻烦,而且我发现我其他的tableview都没有这个问题,为什么这个会出现?对比一下发现我这里是用到textfield作为tableview的sectionView,并通过输入字符来reload,尝试把textfield从tableview中移出来固定在view上,结果就不会崩溃了。。。神奇

 

这是我个人的情况,还是建议使用作者所说的方法,其他包含替换的库也一并拉出来修改。

https://github.com/CoderMJLee/MJRefresh/issues/1060

### 关于在 SwiftUI 中使用 `LazyVGrid` 或 `LazyHGrid` 刷新数据 在 SwiftUI 中,不存在直接类似于 UIKit 的 `reloadData()` 方法来刷新视图。相反,在 SwiftUI 中更新视图的方式依赖于状态管理机制。当绑定到视图的状态发生变化时,视图会自动重新渲染。 对于 `LazyVGrid` 和 `LazyHGrid` 这样的懒加载容器来说,如果希望其内部项目能够响应模型变化而更新,则应该确保这些项目的创建基于某个可观察对象 (ObservableObject) 或者状态变量 (`@State`) 。每当这个源数据发生改变时,整个列表将会被重绘以反映最新的信息[^1]。 具体实现可以如下所示: ```swift struct ContentView: View { @ObservedObject var viewModel = ContentViewModel() var body: some View { ScrollView { LazyVGrid(columns: [GridItem(.adaptive(minimum: 80))]) { ForEach(viewModel.items, id:\.self) { item in Text(item) .padding() .background(Color.gray.opacity(0.2)) .cornerRadius(8) } } } .refreshable { await viewModel.fetchItems() // 使用 refreshable 来处理下拉刷新逻辑 } } } class ContentViewModel: ObservableObject { @Published private(set) var items: [String] = [] func fetchItems() async { do { let newItems = try await fetchDataFromAPI() DispatchQueue.main.async { self.items = newItems } } catch { print(error.localizedDescription) } } private func fetchDataFromAPI() async throws -> [String] { // 模拟网络请求延迟 sleep(2) return ["Item \(Int.random(in: 1...100))", "Item \(Int.random(in: 101...200))"] } } ``` 上述代码展示了如何利用 Swift Concurrency 特性中的 `.refreshable{}` 修改器配合异步函数来进行下拉刷新操作,并且通过设置 `DispatchQueue.main.async {}` 确保 UI 更新发生在主线程上[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值