【问题标题】:Objective-C - UIViewController loading on top of another controllerObjective-C - UIViewController 加载在另一个控制器之上
【发布时间】:2017-08-10 10:58:42
【问题描述】:

我正在使用 NSNotification 中心来检测货币变化,因此我可以更新所有其他类。当货币发生变化时,所有其他类和视图都会更新,但是当没有货币变化时,如果您按后退按钮返回主页,则视图会加载到现有视图的顶部。

NSNotification 中心代码

  if ([overviewModel.currency isEqual:@"GBP"]){
                [[NSNotificationCenter defaultCenter] postNotificationName:@"DataUpdated"
                                                                    object:self];
            } else {

                [[NSNotificationCenter defaultCenter] postNotificationName:@"DataUpdated"
                                                                    object:self];
            }

主页更新数据处理代码:

  for (UIView *b in self.view.subviews) {
    [b removeFromSuperview];
}


self.build = [[ApiRequestBuild alloc]initWithVersionKey:kAPI_VERSION_KEY requestType:kAPI_REQUEST_TYPE data:@""];
[self.build setQueryWithSection:@"homepage" value:@"" parameter:@[]];

self.request = [[ApiRequest alloc]init];
self.request.delegate = self;
[self.request sendRequestWithParams:[self.build buildConfig] toUrl:kAPI_URL_STRING];

我知道为什么会这样,请求被再次发送,所以页面加载到已经存在的页面之上,我不明白为什么从子视图中删除代码没有摆脱视图我将如何解决这个问题?谢谢

【问题讨论】:

  • @Dev_Tandel 是的,仍然是同样的问题。我将创建一个全局变量并将其设置为 nil ,然后仅在货币更改时为其添加一个值,这样主页才会更新。
  • 但是为什么要删除子视图?您只需要在货币更改时全部更新
  • @Dev_Tandel 更新主页,我发送另一个请求以再次获取主页,如果我不删除子视图,它会在现有视图之上添加视图。
  • 抱歉@Taha Amini - 我真的没有得到你希望实现这一目标并获得主页的人。你正在开发原生应用程序对吗?

标签: ios objective-c nsnotificationcenter


【解决方案1】:

如果从另一个线程(而不是主线程)调用 removeFromSuperview 将不起作用。您的通知将在触发它的同一线程上收到。我敢打赌,您正在另一个线程上收听模型更改事件(关于您的货币状态)。

在遍历您的子视图副本以将它们全部删除之前尝试分派到主队列。

【讨论】:

  • 在遍历子视图副本之前调度到主队列是什么意思?你能解释一下吗?谢谢
  • dispatch_async(dispatch_get_main_queue(), ^{ [removeFromSuperview]; });像这样?
  • @TahaAmini 是的!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-24
  • 1970-01-01
  • 2013-08-09
  • 1970-01-01
  • 2016-10-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多