菜鸟教程小白 发表于 2022-12-13 02:52:46

ios - UIView 中的 NSNotifications 和 removeObserver


                                            <p><p>我创建了一个子类<code>UIView</code>:</p>

<pre><code>BeneficialsFormView *view = [ init];
view.alpha = 0;
view.delegate = self;

view.screenView = ;
</code></pre>

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

<p>在子类 <code>UIView</code> 中,我添加了键盘通知:</p>

<pre><code>-(void)awakeFromNib {
    DLog(@&#34;fired&#34;);

    [ addObserver:self selector:@selector(keyboardEvent:) name:UIKeyboardWillShowNotification object:nil];
    [ addObserver:self selector:@selector(keyboardEvent:) name:UIKeyboardWillHideNotification object:nil];

    // UI Code
}
</code></pre>

<p>我尝试删除 <code>dealloc</code> 中的 <code>NSNotifications</code>:</p>

<pre><code>-(void)dealloc {
    DLog(@&#34;fired&#34;);

    [ removeObserver:self forKeyPath:UIKeyboardWillShowNotification];
    [ removeObserver:self forKeyPath:UIKeyboardWillHideNotification];
}
</code></pre>

<p>问题是 <code>dealloc</code> 在 <code>awakeFromNib</code> 之后立即被触发:</p>

<pre><code>2013-06-12 15:37:39.260DEBUG | - | fired
2013-06-12 15:37:39.287DEBUG | - | fired
2013-06-12 15:37:39.339DEBUG | - | fired
</code></pre>

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

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

<p>我正在使用 ARC。</p>

<p>我做错了什么?</p>

<p>编辑:</p>

<p>发现我做错了什么:</p>

<pre><code>-(id)init {
    DLog(@&#34;fired&#34;);
    DLog(@&#34;self: %@&#34;,self);

    self = ;

    if (self) {
      self = [[ loadNibNamed:@&#34;BeneficialsFormView&#34; owner:self options:nil] objectAtIndex:0];
    }

    return self;
}
</code></pre>

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

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

<pre><code>2013-06-12 18:15:33.957DEBUG | - | fired
2013-06-12 18:15:33.959DEBUG | - | self: &lt;BeneficialsFormView: 0x1f0b1d50; frame = (0 0; 0 0); transform = ; alpha = 0; opaque = NO; layer = (null)&gt;

2013-06-12 18:15:33.988DEBUG | - | fired
2013-06-12 18:15:33.989DEBUG | - | self: &lt;BeneficialsFormView: 0x1e58da60; frame = (0 0; 350 400); autoresize = RM+BM; layer = &lt;CALayer: 0x1e5c60f0&gt;&gt;

2013-06-12 18:15:34.044DEBUG | - | fired
2013-06-12 18:15:34.045DEBUG | - | self: &lt;BeneficialsFormView: 0x1f0b1d50; frame = (0 0; 0 0); layer = &lt;CALayer: 0x1f0d4830&gt;&gt;
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你把它弄得太复杂了。简单一点:</p>

<p>1.) 加载基础 View </p>

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

<p>3.) 如果是这样,只需将渐变叠加为 subview 。当用户按下按钮离开 View 时,移除 NSNotificationCenter 观察者。 <strong>NOT</strong> 在 dealloc 中删除它。它经常被延迟,您会看到同样的问题发生。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - UIView 中的 NSNotifications 和 removeObserver,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/17075047/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/17075047/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - UIView 中的 NSNotifications 和 removeObserver