菜鸟教程小白 发表于 2022-12-12 15:55:29

ios - 无法在带有 block 的 UITableViewCell 中设置 UIButton 标题


                                            <p><p>我在自定义 <code>UITableViewCell</code> 中有一个 <code>UIButton</code>,当我按下按钮时,它会使用 <code>AFNetworking</code> 将数据发布到我的服务器,在成功 block我设置了一个新的按钮标题,但它不起作用。
在 <code>CutomTableViewCell</code> 中,我使用了一个协议(protocol),所以我可以响应按钮点击:</p>

<pre><code>@implementation SubjectReplyCell

- (IBAction)btnReplyPressed:(UIButton *)sender {

    if (self.delegate &amp;&amp; ) {
      ;
    }
}
@end
</code></pre>

<p>然后我实现委托(delegate)并将数据发布到服务器:</p>

<pre><code>@implementation BBSDetailsController
- (void)postData:(SubjectReplyCell *)cell atIndex:(NSInteger)idx {
    urlString = ;
    __weak typeof(SubjectReplyCell) *weakCell = cell;

    [requestManager POST:urlString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
      if ( isEqualToString:@&#34;success&#34;]) {
            //it doesn&#39;t work
            ;
            ;
      }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    }];
}
</code></pre>

<p>但是,如果我将标题设置在 block 之外,它会很好地工作:</p>

<pre><code>- (void)postData:(SubjectReplyCell *)cell atIndex:(NSInteger)idx {
    urlString = ;

    //it work
    ;

    [requestManager POST:urlString parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
      if ( isEqualToString:@&#34;success&#34;]) {

      }
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {

    }];
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>AFNetworking 默认使用主队列来处理失败和完成 block ,因此您无需担心自己为 UI 更改调用主线程。 <a href="https://stackoverflow.com/questions/17225193/are-afnetworking-success-failure-blocks-invoked-on-the-main-thread" rel="noreferrer noopener nofollow">See this answer</a> </p>

<p>如果要修改 block 内的对象,则需要使用 <code>__block</code> 关键字(即两个下划线)。使用 <code>__block</code> 会提前告诉编译器您计划改变 block 内的对象,因此请以不同的方式处理该对象以保留更改。 </p>

<p>所以这个:</p>

<pre><code>__weak typeof(SubjectReplyCell) *weakCell = cell;
</code></pre>

<p>应该是这样的:</p>

<pre><code>__block typeof(SubjectReplyCell) *weakCell = cell;
</code></pre>

<p>编辑:
您不需要在您的单元格上使用 <code>__weak</code> ,因为在此 block 中修改您的单元格不应创建引用循环。在这种情况下,您的单元格将保留在完成 block 中,但单元格本身并不保留 block ,因此这两个不会创建保留循环。 </p>

<p>你需要使用 <code>__weak</code> 如果两个正在运行的对象有可能导致一个保留循环,比如当你在一个 block 中捕获 self 并且该 block 也被 self 捕获时。 <a href="https://stackoverflow.com/questions/20030873/always-pass-weak-reference-of-self-into-block-in-arc" rel="noreferrer noopener nofollow">Here&#39;s another answer for some more clarity</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 无法在带有 block 的 UITableViewCell 中设置 UIButton 标题,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/31705079/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/31705079/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 无法在带有 block 的 UITableViewCell 中设置 UIButton 标题