• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - UIView 中的 NSNotifications 和 removeObserver

[复制链接]
菜鸟教程小白 发表于 2022-12-13 02:52:46 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我创建了一个子类UIView:

BeneficialsFormView *view = [[BeneficialsFormView alloc] init];
view.alpha = 0;
view.delegate = self;

view.screenView = [self.delegate displayEntityForm:view];

委托(delegate)调用是显示 UIView 并返回一个 UIView,我用它来禁用背景触摸(只是一个黑色背景颜色和减少 alpha 的 UIView)。

在子类 UIView 中,我添加了键盘通知:

-(void)awakeFromNib {
    DLog(@"fired");

    [[NSNotificationCenter defaultCenter] addObserver:self selectorselector(keyboardEvent name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selectorselector(keyboardEvent name:UIKeyboardWillHideNotification object:nil];

    // UI Code
}

我尝试删除 dealloc 中的 NSNotifications:

-(void)dealloc {
    DLog(@"fired");

    [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIKeyboardWillShowNotification];
    [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:UIKeyboardWillHideNotification];
}

问题是 deallocawakeFromNib 之后立即被触发:

2013-06-12 15:37:39.260  DEBUG | -[BeneficialsFormView init] | fired
2013-06-12 15:37:39.287  DEBUG | -[BeneficialsFormView awakeFromNib] | fired
2013-06-12 15:37:39.339  DEBUG | -[BeneficialsFormView dealloc] | fired

它们都在 0.1 秒内发射。子类 UIView 的行为完全符合我的要求;它显示,它的所有内容都有效,我可以 removeFromSuperview 没有问题。

我假设 dealloc 会在所有对子类 UIView 的引用都达到 0 时触发?

我正在使用 ARC。

我做错了什么?

编辑:

发现我做错了什么:

-(id)init {
    DLog(@"fired");
    DLog(@"self: %@",self);

    self = [super init];

    if (self) {
        self = [[[NSBundle mainBundle] loadNibNamed"BeneficialsFormView" owner:self options:nil] objectAtIndex:0];
    }

    return self;
}

所以我用我的 init 方法创建了我的 View ,该方法加载了 xib 文件。 awakeFromNib 触发,然后我使用 init 文件创建的对象失去引用并被释放,同时显示从 awakeFromNib 创建的对象。

我该如何解决这个问题?还是我在做一些根本错误的事情并在时空连续体中造成撕裂?

2013-06-12 18:15:33.957  DEBUG | -[BeneficialsFormView init] | fired
2013-06-12 18:15:33.959  DEBUG | -[BeneficialsFormView init] | self: <BeneficialsFormView: 0x1f0b1d50; frame = (0 0; 0 0); transform = [0, 0, 0, 0, 0, 0]; alpha = 0; opaque = NO; layer = (null)>

2013-06-12 18:15:33.988  DEBUG | -[BeneficialsFormView awakeFromNib] | fired
2013-06-12 18:15:33.989  DEBUG | -[BeneficialsFormView awakeFromNib] | self: <BeneficialsFormView: 0x1e58da60; frame = (0 0; 350 400); autoresize = RM+BM; layer = <CALayer: 0x1e5c60f0>>

2013-06-12 18:15:34.044  DEBUG | -[BeneficialsFormView dealloc] | fired
2013-06-12 18:15:34.045  DEBUG | -[BeneficialsFormView dealloc] | self: <BeneficialsFormView: 0x1f0b1d50; frame = (0 0; 0 0); layer = <CALayer: 0x1f0d4830>>



Best Answer-推荐答案


你把它弄得太复杂了。简单一点:

1.) 加载基础 View

2.) 检查是否需要显示 View 以禁用背景触摸的标准

3.) 如果是这样,只需将渐变叠加为 subview 。当用户按下按钮离开 View 时,移除 NSNotificationCenter 观察者。 NOT 在 dealloc 中删除它。它经常被延迟,您会看到同样的问题发生。

关于ios - UIView 中的 NSNotifications 和 removeObserver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17075047/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap