【问题标题】:UIActivityIndicatorView in UITableViewCell does not stop spinningUITableViewCell 中的 UIActivityIndi​​catorView 不会停止旋转
【发布时间】:2011-12-10 08:34:15
【问题描述】:

我有一个名为 AccountView 的子类 UITableViewCell,其中包含一个 UIActivityIndi​​catorView。每个单元格都应该包含一个 Twitter 帐户。当用户向 Twitter 发布消息时,UIActivityIndi​​catorView 应该开始旋转,然后在执行 twitter 请求处理程序时停止动画:

[postRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error){
        if (error != nil) {
            NSLog(@"TWITTER ERROR: %@",error);
        }
        NSLog(@"Posted successfully");
        AccountCell *cell = (AccountCell *)[accountTable cellForRowAtIndexPath:[NSIndexPath indexPathForRow:[accounts indexOfObject:account] inSection:0]];
        NSLog(@"Cell isSpinning?  :%d",[[cell activity] isAnimating]);
        [[cell activity] stopAnimating];
        NSLog(@"Cell isSpinning?  :%d",[[cell activity] isAnimating]);
    }];

在向 Twitter 发布短消息时一切正常,但是,当 TWRequest 包含要上传的图像时,几秒钟后,带有图像的帖子出现在 Twitter 上,我在控制台中看到以下消息:

2011-12-10 00:13:22.085 TwitTest[14954:1a03] Posted Successfully
2011-12-10 00:13:22.086 TwitTest[14954:1a03] Cell isSpinning?  :1
2011-12-10 00:13:22.088 TwitTest[14954:1a03] Cell isSpinning?  :0

但 UIActivityIndi​​catorView 会无限期地旋转(或至少延迟几秒钟),即使日志消息表明并非如此。这只在图片上传时中断的事实让我相信也许我应该在后台线程上发送请求,但我以前从未处理过线程,并且不能确定这是否是问题。

最后一件事,如果我导航到不同的视图并返回,UIActivityIndi​​catorView 会显示为冻结状态 - 如果我导航离开并再次返回,那么它会永远消失。

【问题讨论】:

    标签: iphone objective-c ios uitableview uiactivityindicatorview


    【解决方案1】:

    来自 Apple Developer 的文档:“不能保证在任何特定线程上调用此处理程序。”也许您的界面循环正在工作,并且在每次运行循环之后都会考虑修改。

    尝试在主线程中执行界面更改。使用 performSelectorOnMainThread:withObject:

    【讨论】:

    • 试过了,现在可以了。我不明白的一件事是,NSLog 消息报告 ActivityView 在停止微调器之前和之后是否正在旋转,现在都返回 1。
    • 简单,这是因为正如我所料,主线程正在工作,因此不会立即参加该工作。您可以强制等待使用 performSelectorOnMainThread:withObject:waitUntilDone:YES
    • 那么您认为 Twitter 框架是否有可能将所有请求推送到后台线程,因此 stopAnimating 命令被卡在低优先级而不被执行?我想我很困惑,因为 NSLog 正在执行,他们说 ActivityView 不应该旋转,但它仍然旋转了很长一段时间。
    • 你在其中失去了一些东西。 NSLog 以及您的代码对 UI 对象所做的任何修改都是准时完成的。您将 Activity View 设置 isAnimating 修改为 YES,然后使用 NSLog 编写一些内容。但是,您只对对象进行了修改。然后,每次您的应用程序的主循环在收到消息后结束时,系统才会考虑您对 UI 对象所做的修改,因此您可以看到结果。
    【解决方案2】:

    您可以尝试添加该行:

    [CATransaction flush];
    

    在您发送 stopAnimating 消息之后。如果问题是事件循环没有足够快地出现,这将有所帮助。不清楚这是您提供的问题,但值得一试。背景见this question and answer

    更新您需要在头文件中添加#import <QuartzCore/QuartzCore.h>,并确保您已使用 Targets 中的 Build Phases(Link Binary With Libraries)选项添加了 QuartzCore 框架。

    【讨论】:

    • 我添加了该行,但出现编译器错误 - 看起来我必须在 QuartzCore 框架中添加才能使用它。
    • 虽然我标记为正确的解决方案适用于我的上述问题,但我遇到了另一个自定义动画被延迟的问题。你的解决方案成功了。 +1
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-06
    • 1970-01-01
    相关资源
    最近更新 更多