首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

swift UITableView/ UICollectionView调用观察(\.xxx)不起作用

在Swift中,UITableViewUICollectionView的观察(Observation)通常是通过NotificationCenter或者KVO(Key-Value Observing)来实现的。如果你发现调用观察(.xxx)不起作用,可能是以下几个原因:

基础概念

  1. NotificationCenter:用于发送和接收通知,可以在不直接耦合对象的情况下进行通信。
  2. KVO:允许对象观察另一个对象的属性值变化,并在变化时自动通知观察者。

可能的原因及解决方法

1. NotificationCenter未正确设置

确保你已经正确地添加了观察者并且发送了通知。

示例代码:

代码语言:txt
复制
// 添加观察者
NotificationCenter.default.addObserver(self, selector: #selector(handleNotification), name: NSNotification.Name("YourNotificationName"), object: nil)

// 发送通知
NotificationCenter.default.post(name: NSNotification.Name("YourNotificationName"), object: nil)

// 处理通知
@objc func handleNotification(notification: Notification) {
    // 处理通知逻辑
}

2. KVO未正确实现

如果你使用KVO,确保你已经正确地注册了观察者并且实现了必要的方法。

示例代码:

代码语言:txt
复制
class YourViewController: UIViewController {
    @objc dynamic var observedProperty: String = ""

    override func viewDidLoad() {
        super.viewDidLoad()
        self.addObserver(self, forKeyPath: "observedProperty", options: [.new, .old], context: nil)
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        if keyPath == "observedProperty" {
            // 属性变化时的处理逻辑
        }
    }

    deinit {
        self.removeObserver(self, forKeyPath: "observedProperty")
    }
}

3. 生命周期问题

确保观察者在正确的生命周期内被添加和移除,避免在视图控制器已经被释放后仍然尝试接收通知。

4. 线程问题

NotificationCenter的通知默认在主线程发送,如果你的处理逻辑需要在后台线程执行,记得切换线程。

示例代码:

代码语言:txt
复制
@objc func handleNotification(notification: Notification) {
    DispatchQueue.global(qos: .userInitiated).async {
        // 后台处理逻辑
    }
}

5. 观察者或通知名称错误

检查观察者是否正确注册,以及通知名称是否完全匹配。

应用场景

  • UITableView/UICollectionView刷新:当数据源变化时,通过通知或KVO来刷新界面。
  • 状态监控:监控某个状态的变化,如用户登录状态、网络状态等。

优势

  • 解耦:NotificationCenter和KVO都允许在不直接依赖其他对象的情况下进行通信。
  • 灵活性:可以轻松地添加或移除观察者,适应不同的业务需求。

通过以上步骤,你应该能够诊断并解决UITableViewUICollectionView中观察者模式不起作用的问题。如果问题仍然存在,建议检查控制台输出是否有相关的错误信息,这可能会提供更多线索。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

  • 【已解决】Xcode9 打包出来的 UITableView 的高度代理不走 但是 Xcode8打包就可以

    问题描述 我们首页有点复杂,因为结构是下面是一个横向滚动的 UIScrollView 上面是一个 UITableView 但是整体看起来是连贯的 所以上面的 UITableView 的高度就要算出来。...解决办法 _tableView.rowHeight = 0; _tableView.estimatedRowHeight = 0; 感谢2017@Swift群里面的 List提供的解决办法。...设置这两个属性之后,首页上面 UITableView 的数据果然出现了。 虽然解决了,但是首页因为多个 UIScrollView 导致十分滚动会卡顿。...这个最好的解决办法是抛弃左右滚动切换功能 这样最下面的 UICollectionView 就可以不用 直接整体一个 UITableView 这样就可以实现滚动顺畅。

    56620

    iOS开发之DiffableDataSource

    在 iOS 13 中 Apple 为 UITableView 和 UICollectionView 引入了 DiffableDataSource,让开发者可以更简单高效的实现 UITableView、UICollectionView...新的刷新的方法为 apply,通过使用 apply 方法无需计算变更的 indexPaths,也无需调用 reload,即可安全地在主线程或后台线程更新 UI, 仅需简单的将需要变更后的数据通过 NSDiffableDataSourceSnapshot...下面以 UITableView 为例进行讲解。 实现步骤 使用 DiffableDataSource 配置当前 UITableView 的数据源。...DiffableDataSource 通过调用自身 apply 方法将 DataSourceSnapshot 变更后的数据更新同步到 UITableView。...的关键使用步骤,UIColletionView 使用类似,完整案例详见下面的链接: UITableView案例 UICollectionView案例

    1.7K10

    Swift 探索 UICollectionView 之 SupplementaryView 和 Decoration View

    Supplementary View 用过 UITableView 控件的同学肯定都知道我们可以给它的每个 section 加上 headerView 和 footerView,那在 UICollectionView...为 UICollectionView 添加 Supplementary View 首先看下效果图: 具体代码逻辑如下,注释已经在代码中添加: // // BaseAPIViewController.swift...添加手势后,根据手势提供的三种状态,分别调用上面的四个方法,来实现拖拽排序;另外,既然 Cell 的顺序会被调整,那我们还得及时的更新数据源,来保证视图刷新后,导致拖拽的结果被还原,具体实现代码如下:...UITableView 稍微复杂一些。...几行代码的事情,但事实上,当你想要去实现一些高度自定义的界面的时候,你才会认识到自己的不足,你并没有对这些知识有更深层次的认知,只有再你自己慢慢实现后,你内心才会感慨 "哦, 原来这些 API 可以这样调用

    2.2K10

    iOS小经验:UITableView&UICollectionView设置单元格的默认选中状态

    UITableView 3.1 通过屏幕点击改变的选中状态回调给代理 //选中 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath...:(NSIndexPath *)indexPath; 3.2 代码设置默认选中状态 (要等数据加载完成之后再调用) 执行方法的主体:tableview对象 //选中 - (void)selectRowAtIndexPath...UICollectionView 4.1 通过屏幕点击改变的选中状态回调给代理 //选中 - (void)collectionView:(UICollectionView *)collectionView...didSelectItemAtIndexPath:(NSIndexPath *)indexPath; //非选中 - (void)collectionView:(UICollectionView *)...collectionView didDeselectItemAtIndexPath:(NSIndexPath *)indexPath; 4.2 代码设置默认选中状态 (要等数据加载完成之后再调用) 执行方法的主体

    3.6K50

    【IOS开发基础系列】UICollectionView专题

    1 定义 1.1 什么是UICollectionView         UICollectionView是一种新的数据展示方式,简单来说可以把他理解成多列的UITableView(请一定注意这是UICollectionView...首先UICollectionViewCell不存在各式各样的默认的style,这主要是由于展示对象的性质决定的,因为UICollectionView所用来展示的对象相比UITableView来说要来得灵活...1.6 UICollectionViewLayout         这是UICollectionView和UITableView最大的不同。...dequeueReusableCellWithReuseIdentifier: kInfoCollectionCellIdentifier forIndexPath: indexPath];         在dequeueReusableCell方法中,程序会调用...而不用像笔者一样去画蛇添足地实现一个-(instancetype) initWithFrame: (CGRect) frame WithVM:(HJInfoCellVM *) vm方法,后面这个方法永远也调用不到

    91430

    手把手带你撸一个网易云音乐首页(一)

    前言 Hello,大家好,近期我一直在学习用 Swift 编码,由于之前很多项目我都是用 OC 实现的,所以导致我现在对 Swift 还是处于一个学习的阶段中。...为了提高自己的学习效率,每次我都会为自己定下一个短期的目标,就那这次来说吧,为了加快自己上手 Swift, 我为自己定下了的目标就是完成一个 Swift 版本的网易云音乐 App。...上找有没有开源的 API,不找不知道,一找果然很满意,原来早就有大佬提供了网易云音乐的 API: image 其中就有“首页发现” 和 “首页-发现-圆形图标入口列表” 的 API, 无需我们进行多个接口的调用以及数据源的拼接......... } 数据源的问题解决了,接下来就是该解决如何将数据可视化了,从网易云音乐首页展示的效果分析来看,整体的视图支持上下滚动,其中单个 Cell 的视图支持横向滚动,所以这里采用 UITableView...嵌套 UICollectionView 的方式应该来说再合适不过了。

    1K20

    iOS 面试策略之系统框架-UIScrollView及其子类

    UIScrollView 恐怕是所有 App 都绕不过去的类——尤其是它的子类 UITableView 和 UICollectionView。...当用户滑动列表的时候,如果 reuseIdentifier 不为 nil,UITableView 会自动去调用已经生成好的UITableViewCell 来展示内容。...UITableViewDelegate 用来处理 UITableView 的 UI 和交互:例如设置 UITableView 的 header 和 footer,点击、高亮某个 UITableViewCell...prepare() 完成布局之后该方法被调用,它决定了哪些 item 在 CollectionView 给定的区域内可见。我们只要取交集(intersect)即可。...完成这些设定之后,我们发现 UICollectionView 里每个 item 里的高度需要从含有 UICollectionView 的 ViewController 里获得。

    2.7K21

    手把手带你撸一个网易云音乐首页(三)

    前言 Hello, 大家好,今天准备和大家继续分享如何利用 Swift 来实现一个网易云音乐的首页;上俩篇文章文章发布以后,我收获了不少小伙伴的关注与点赞,同时也得到了一些非常有用的建议,在这里再次感谢大家的认可...为了进一步的提高代码的质量,我们可以为这些 Cell 定义一个基类 BaseViewCell,这样通过该基类,我们就可以设置一些默认的属性,减少一些不必要的编码工作;另外,通过观察你会发现,大部分的 Section...关于 headView 的实现方式,想必使用过 UITableView 的同学都不会陌生,可以通过下面的方法来实现: - (nullable UIView *)tableView:(UITableView...给 headView 的左上角和右上角添加圆角效果 给 Section 里的 Cell 的左下角和右下脚添加圆角效果 如图所示: image 我们知道,要为一个视图添加圆角是非常有讲究的,如果直接调用...但是,通过观察你会发现它的 UI 样式其实是有讲究的,就是在同一个页面中,它的第二个 item 也需要露出一部分,这该如何去实现呢!

    2.3K10

    UICollectionView 很简单的写个瀑布流

    739006-20160607165303027-1215360678.png 先说说控制器里面的代码,控制器里面就是我们的  UICollectionView  的一些基本的创建了。...其实它和 UITableView 相比较的话,但从创建使用看的话,是挺相似的,但其实它真的比 UITableView 要强大好多!很值得大家去好好的学习学习!...你要占我它的基本创建的话,可以参考 UITableView ,参考对比也有利于学习。...上面的控制器说完了,就到重点了,也就是继承与  UICollectionViewFlowLayout 的  zxFlowLayout ,有一点大家注意一下,就是你在初始化UICollectionView...#import "zxFlowLayout.h" @implementation zxFlowLayout // 数组相关的属性在这里重写 // 在布局之前会调用的这个方法 -(void)prepareLayout

    1.1K70

    抛弃UITableView,让所有列表页不再难构建

    虽然抛弃UITableView是不存在的,但是看完这篇文章确实能让90%的列表页抛弃UITableView,让界面易实现易复用。...准备工作:布局collectionView和绑定适配器 BaseListViewController.swift let collectionView: UICollectionView =...第三个:图片展示 九宫格的图片展示,用UICollectionView是最简单的实现方式。...Feed } } 这里把点击commentCell的删除按钮事件代理出来给CommentSectionController处理,在闭包里先对cellModels数组删除,然后调用IGListKit...基本上都是要自己计算cell的size的,不过IGListKit将大cell分成小cell了,计算高度已经变的容易很多了,这个缺点可以忽略了 因为是基于UICollectionView的,所以没有UITableView

    1.7K30
    领券