草庐IT

ios - UITableView内部的UIRefreshControl导致应用程序卡住旋转-iOS 6+

coder 2024-01-25 原文

好的,StackOverflow的人...我有一个很有趣的问题,我一直在努力解决数日,无法解决,因此我需要一些重要的帮助。这很可能是一个非常冗长的描述,但是请您多多包涵,并在此先深深地感谢您阅读所有这些内容,因为我的用词越多,我就越能清楚地向大家描述整个情况。我将竭尽所能,做到尽可能简洁和连贯。请让我知道我哪里不足。

这是我问题的上下文:我在iOS应用程序和应用程序中的特定导航选项卡上使用情节提要,我必须为纵向和横向创建两个单独的场景。这样做的原因(而不是使用Autolayout)是因为在该选项卡中,根据方向的不同,视觉元素(表格视图,Web视图等)的布局也有所不同,这要容易得多创建一个单独的定位场景来处理UI中的此更改,而不是通过编程方式来完成-(这也更容易理解和更清晰地执行代码)。因此,需要记住的所有事情是,这两个单独的“纵向”和“横向”场景代表了我的应用程序中的“相同”选项卡。 (旁注:这些场景当然是在IB中制作的)

现在,我在前面的UI中提到的可视元素-更深入地介绍,它们都是不同UIViewControllers的容器。我将应用程序中的所有内容沙盒化,并且几乎所有内容都具有一对一的关系,因此这些容器将映射到我为特定目的而创建的子类UIViewControllers,但这是我的问题的第一个警告出现。这是一个更清晰图片的实际示例,我有一个UIViewController,其中包含一个称为UITableViewMXSAnnouncementsViewController,并且在Landscape和Portrait场景中都存在相同的视图控制器。我没有为该视图控制器创建显式的Portrait或Landscape VERSION,而是让该控制器跟踪指向特定于方向的IBOutlet的两个tableViewLandscape属性(tableViewPortraitUITableViews),并且这种方法可以很好地工作。此外,在MXSAnnouncementsViewController中,我有一个名为tableView的本地属性,该属性抽象了特定于方向的表视图。它在viewDidLoad中设置,您可以在下面看到:

- (void)viewDidLoad
{
    [super viewDidLoad];

    if (self.tableViewPortrait) {
        self.tableView = self.tableViewPortrait;
    } else {
        self.tableView = self.tableViewLandscape;
    }

    [self.tableView setDelegate:self];
    [self.tableView setDataSource:self];

    if (![MXSAnnouncementManager sharedAnnouncementManager].latestAnnouncements) {
        [MXSAnnouncementManager loadModel:@"MXSAnnouncementGroupAllAnnouncements" withBlock:^(id model, NSError *error) {
            if (!error) {
                self.arrayLatestAnnouncements = [MXSAnnouncementManager sharedAnnouncementManager].latestAnnouncements;
                [self.tableView reloadData];
            } else {
                // show some error msg
            }
        }];
    } else {
        self.arrayLatestAnnouncements = [MXSAnnouncementManager sharedAnnouncementManager].latestAnnouncements;
    }

    [self setupPullToRefresh];
}

每当我在选项卡中时,两个特定于方向的IBOutlets之一始终处于 Activity 状态,并且在内存中具有地址,而另一个是nil。每当我轮换使用时,角色都会反转-以前在内存中具有地址的任何内容现在都为nil,而另一个已初始化并分配了,这就是为什么我要使用上面代码段中的tableView属性进行操作的原因。这是警告#2出现在其中的地方,这是个麻烦事-它与视图生命周期有关。为了清楚起见,这是一个实际的示例:说我以横向放置应用程序。当我这样做时,我的tableViewLandscape出口在内存中有一个地址,而我的tableViewPortrait出口是nil。这是预期的行为。现在,当我旋转应用程序时,疯狂的事情开始了。在这个地方,我需要所有人了解UIViewControllers实例以及正常与非正常情况,因此请缓慢而仔细地阅读以下内容。

立即旋转应用程序将导致相反方向的场景(MXSAnnouncementsViewController的另一个INSTANCE ???)调用其viewDidLoad方法(在此示例中,我们在Landscape中,因此Portrait场景将调用该方法)。在该方法中,将我的本地tableView属性设置为该方向的当前 Activity 表格视图(请参见上面的代码段)。该方法完成后,先前的MXSAnnouncementsViewController LANDSCAPE实例将调用其viewWillDisappear方法,然后调用PORTRAIT实例对其viewWillAppear方法进行调用,然后最后以LANDSCAPE实例调用其willRotateToInterfaceOrientation回调作为结束-这就是我的操作顺序我从断点看到。我真的希望您能得到所有这些,因为我的想法刚刚从这一切中消失了。

如果此时您仍然与我在一起,谢谢,因为我们终于可以在家了。就像这篇文章的标题所暗示的那样,我要解决的问题是我的应用程序冻结了旋转。如果您没有注意到viewDidLoad片段,则最后一条要执行的指令是setupPullToRefresh方法,如下所示:
- (void)setupPullToRefresh
{
    UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
    [refreshControl addTarget:self action:@selector(refreshTableView:) forControlEvents:UIControlEventValueChanged];
    [self.tableView addSubview:refreshControl];
}

因为我已经在前面解释了旋转操作的整个视图生命周期顺序,所以总而言之,如果我在setupPullToRefresh末尾为viewDidLoad注释掉最后一条MXSAnnouncementsViewController指令,则我的应用程序可以正常工作。如果我包含该指令,则我的应用程序在第一次旋转时将变得完全无响应,并且我一生都无法找出原因。不知道我在这里处理的是什么情况。欢迎任何见解,并非常感谢您阅读所有这些内容!

最佳答案

最好的方法可能是放弃当前的设计,即使用两个单独的纵向和横向控制器。在iOS上,您应始终按所需方向重播视图,而不要破坏和重新创建所有内容。通过尝试通过重新创建所有内容来处理它,我只会遇到麻烦。

如果您知道的话,可以使用自动布局在旋转时对视图进行复杂的重新排序,但最好的选择是取消当前代码以进行横向显示,并编写代码以在旋转时自行重新排列视图。您所遇到的问题将大大减少,您的代码也将更易于他人理解和维护。

当您删除一小段代码时,您的应用程序似乎可以正常运行,但是幕后可能发生了一些不太正确的事情,将来可能会再次引起您的注意。这可能就是为什么添加代码行会破坏它。

关于ios - UITableView内部的UIRefreshControl导致应用程序卡住旋转-iOS 6+,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20889203/

有关ios - UITableView内部的UIRefreshControl导致应用程序卡住旋转-iOS 6+的更多相关文章

  1. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  2. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  3. Ruby 文件 IO 定界符? - 2

    我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的

  4. 旋转矩阵的几何意义 - 2

    点向量坐标矩阵的几何意义介绍旋转矩阵的几何含义之前,先介绍一下点向量坐标矩阵的几何含义点:在一维空间下就是一个标量,如同一条直线上,以任意某一个位置为0点,以一定的尺度间隔为1,2,3...,相反方向为-1,-2,-3...;如此就形成了一维坐标系,这时候任何一个点都可以用一个数值表示,如点p1=5,即即从原点出发沿着x轴正方向移动5个尺度;点p2=-3,负方向移动3个尺度;     在一维坐标系上过原点做垂直于一维坐标系的直线,则形成了二维坐标系,此时描述一个点需要两个数值来表示点p3=(3,2),即从原点出发沿着x轴正方向移动3个尺度,在此基础上沿着y轴正方向移动两个尺度的位置就是点p3。

  5. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  6. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  7. Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting - 2

    1.错误信息:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:requestcanceledwhilewaitingforconnection(Client.Timeoutexceededwhileawaitingheaders)或者:Errorresponsefromdaemon:Gethttps://registry-1.docker.io/v2/:net/http:TLShandshaketimeout2.报错原因:docker使用的镜像网址默认为国外,下载容易超时,需要修改成国内镜像地址(首先阿里

  8. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

  9. ruby - 为什么不能使用类IO的实例方法noecho? - 2

    print"Enteryourpassword:"pass=STDIN.noecho(&:gets)puts"Yourpasswordis#{pass}!"输出:Enteryourpassword:input.rb:2:in`':undefinedmethod`noecho'for#>(NoMethodError) 最佳答案 一开始require'io/console'后来的Ruby1.9.3 关于ruby-为什么不能使用类IO的实例方法noecho?,我们在StackOverflow上

  10. arrays - Ruby 数组 += vs 推送 - 2

    我有一个数组数组,想将元素附加到子数组。+=做我想做的,但我想了解为什么push不做。我期望的行为(并与+=一起工作):b=Array.new(3,[])b[0]+=["apple"]b[1]+=["orange"]b[2]+=["frog"]b=>[["苹果"],["橙子"],["Frog"]]通过推送,我将推送的元素附加到每个子数组(为什么?):a=Array.new(3,[])a[0].push("apple")a[1].push("orange")a[2].push("frog")a=>[[“苹果”、“橙子”、“Frog”]、[“苹果”、“橙子”、“Frog”]、[“苹果”、“

随机推荐