我正在检查一些其他人编写的代码,作为我被聘用的新工作的一部分。我面临的一个问题是,在某些页面上,当“登录”或“正在连接”显示MBProgressHUD时,它会从中间取出一个块。例如:
显然我正在寻找的东西更像是这样:
只有当应用程序从后台返回时才会发生(即,当应用程序首次启动时,当我们也使用MBProgressHUD
但它完全正常工作时),并且仅在某些页面上。盒子正确加载,然后大约半圈活动指示器,那个洞出现。然后它会一直保持这种状态,直到盒子消失。
我会添加一些代码来查看,但说实话,我不知道从哪里开始。我想不出任何可能从中间出来的东西,正如你从第二张图片的透明度中看到的那样,活动指标背后似乎没有那个形状/大小的盒子。可能会意外地变绿。
我之前从未使用过MBProgressHUD
,而且我从未遇到过这种性质的图形错误。有没有人知道发生了什么,或者失败了,是否有人可以给我一些线索来调查可能造成这种行为的原因?
修改
以下是用于将活动指标添加到HUD的代码(来自MBProgressHUD
对象):
// Update to indeterminate indicator
[self.indicator removeFromSuperview];
self.indicator = nil;
if (IOSVersion >= 8.0 && (DeviceScreenSize().height >= 1136.0 || DeviceScreenSize().width >= 1136.0)) {
self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
} else {
self.indicator = MB_AUTORELEASE([[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]);
}
[(UIActivityIndicatorView *)indicator startAnimating];
[self addSubview:indicator];
这是更大的updateIndicators
方法的一部分,但突出点是:指示符被移除(如果之前有另一个指示符),则重新添加并设置动画。注释掉startAnimating
或addSubview
行,并且HUD没有活动指示符,但问题永远不会发生。
这听起来像是活动指示器的动画以某种方式导致底层视图的缺失部分。但那为什么会这样呢?有没有人听说过这种事情?
编辑2:
据我所知,问题只发生在整个应用程序中的一个ViewController上,但ViewController从不引用任何类型的MBProgressHUD
或活动指示器。所有这些功能都在AppDelegate方法applicationDidBecomeActive:
中,如下所示:
MBProgressHUD* hud = [[MBProgressHUD alloc] initWithWindow:self.window];
[self.window addSubview:hud];
hud.labelText = LocalizedString(@"Logging in...");
[hud showAnimated:YES whileExecutingBlock:^{
User* U = self.SelectedUser;
if (!isEmpty(U)) {
if ([U networkLogin]) {
[self setSelectedUser:U];
if ([U Disabled] != disabledTypesNone) {
[Flurry logEvent:@"Login Failed" withParameters:@{@"Name": U.DisplayName,
@"DeviceID": [@([Device sharedDevice].DeviceID) stringValue],
@"Disabled": [@([U Disabled]) stringValue]}];
ret = NO;
} else {
[Flurry logEvent:@"Login" withParameters:@{@"Name": U.DisplayName,
@"DeviceID": [@([Device sharedDevice].DeviceID) stringValue]}];
[Flurry setUserID:[NSString stringWithFormat:@"%@ - %@", U.EmpID, U.DisplayName]];
}
} else {
ret = NO;
}
}
} completionBlock:^{
[hud removeFromSuperview];
if (!ret) {
[[NSNotificationCenter defaultCenter] postNotificationName:kDisplayLogin object:nil];
} else {
[[NSNotificationCenter defaultCenter] postNotificationName:kLoggedIn object:nil];
}
}];
由于它发生在AppDelegate中,整个应用程序应该是一样的,对吗?然而,当应用程序位于不同的ViewController上时,当调用相同的代码(来自AppDelegate,如同之前)时,它可以正常工作。
什么可能使该方法的行为在不同的ViewControllers之间有所不同?