Ios UITableView标题显示在MBProgressHUD顶部

Ios UITableView标题显示在MBProgressHUD顶部,ios,objective-c,iphone,uitableview,mbprogresshud,Ios,Objective C,Iphone,Uitableview,Mbprogresshud,因此,我有一个子类UITableViewController,它从internet加载一些数据,并在加载过程中使用MBProgressHUD。我使用标准的MBProgressHUD初始化 HUD = [[MBProgressHUD alloc] initWithView:self.view]; [self.view addSubview:HUD]; HUD.delegate = self; HUD.labelText = @"Loading"; [HU

因此,我有一个子类UITableViewController,它从internet加载一些数据,并在加载过程中使用MBProgressHUD。我使用标准的MBProgressHUD初始化

    HUD = [[MBProgressHUD alloc] initWithView:self.view];
    [self.view addSubview:HUD];

    HUD.delegate = self;
    HUD.labelText = @"Loading";

    [HUD show:YES];
结果是:

有没有办法解决这个问题,或者我应该放弃MBProgressHUD


谢谢

这可能是因为
self.view
是一个UITableView,它可以动态添加/删除包括标题在内的子视图,在您将其添加为子视图后,标题可能最终位于HUD的顶部。您应该直接将HUD添加到窗口中,或者(为了进行更多的工作,但可能会得到更好的结果)可以实现UIViewController子类,该子类具有包含表格视图和HUD视图的普通视图。这样,您就可以将HUD完全放在表格视图的顶部。

我的解决方案非常简单。我没有使用self的视图,而是使用了self的navigationController视图

HUD = [[MBProgressHUD alloc] initWithView:self.navigationController.view];
[self.navigationController.view addSubview:HUD];
这应该适用于OP,因为他的图片显示他正在使用
UINavigationController
。如果您没有
UINavigationController
,您可以在UITableView的顶部添加另一个视图,并将HUD添加到该视图中。您必须编写一些额外的代码来隐藏/显示这个额外的视图

不幸的是,这个简单的解决方案(不包括我在上面提到的添加另一个视图的想法)意味着用户无法在HUD显示时使用导航控件。对于我的应用程序来说,这不是问题。但是,如果您有一个长时间运行的操作,并且用户可能想按“取消”,这将不是一个好的解决方案。

我的解决方案是:

self.appDelegate = (kmAppDelegate *)[[UIApplication sharedApplication] delegate];
.
.
_progressHUD = [[MBProgressHUD alloc] initWithView:self.appDelegate.window];
.
[self.appDelegate.window addSubview:_progressHUD];

在涉及UITableViewController的所有场景中都像一个符咒。我希望这对其他人有帮助。快乐编程:)

几分钟前,我遇到了一个类似的问题,在以一种不同的(而且更优雅的)方式指向正确的方向后,我能够解决它:

UITableViewController
子类实现的开头添加以下行:

@synthesize tableView;
将以下代码添加到
UITableViewController
子类的
init
方法的开头,如
initWithNibName:bundle:
viewDidLoad
的开头也可以,不过我建议使用
init
方法):


那么你就不需要再修改你在问题中发布的代码了。上面的代码基本上是将
self.tableView
self.view
分开的(它以前是对与
self.tableView
相同的对象的引用,但现在是一个
UIView
,包含了人们可能期望的表视图).

我也遇到了同样的问题,并决定通过将我的UITableViewController更改为一个普通的UIViewController来解决这个问题,该UIViewController将UITableView作为子视图(类似于jtbandes在其接受的答案中提出的替代方法)。此解决方案的优点是导航控制器的UI不会被阻止,即用户可以简单地离开ViewController,以防他们不想再等待您的及时操作完成

您需要执行以下更改:

头文件:

@interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource>
- (id)initWithStyle:(UITableViewStyle)style;
@end
@interface YourViewController ()
@property (nonatomic, retain) UITableView     *tableView;
@property (nonatomic, retain) MBProgressHUD   *hud;
@end

@implementation YourViewController
#pragma mark -
#pragma mark Initialization & Memory Management
- (id)initWithStyle:(UITableViewStyle)style;
{
    self = [super init];
    if (self) {
        // create and configure the table view
        _tableView = [[UITableView alloc] initWithFrame:CGRectNull style:style];
        _tableView.delegate   = self;
        _tableView.dataSource = self;
    }
    return self;
}

- (void)dealloc
{
    self.tableView = nil;
    self.hud = nil;

    [super dealloc];
}

#pragma mark -
#pragma mark View lifecycle
- (void)loadView {
    CGRect frame = [self boundsFittingAvailableScreenSpace];
    self.view = [[[UIView alloc] initWithFrame:frame] autorelease];

    // add UI elements
    self.tableView.frame = self.view.bounds;
    [self.view addSubview:self.tableView];
}

- (void)viewWillDisappear:(BOOL)animated
{
    // optionally
    [self cancelWhateverYouWereWaitingFor];
    [self.hud hide:animated];
}

方法
-(CGRect)boundsFittingAvailableScreenSpace
是我的
UIViewController+FittingBounds类别的一部分。您可以在此处找到它的实现:。

在UITableView上创建一个类别,将您的MBProgressHUD放在前面,这样,它将始终显示在“顶部”,并允许用户使用应用程序中的其他控件,如后退按钮(例如,如果操作时间过长)


我刚刚手动解决了这个问题,自从Chris Ballinger问起已经两年了,但也许有人已经习惯了这里发生的事情

在UITableViewController中,我在viewDidLoad中执行一个HTTP方法,该方法在后台运行,以便在显示进度时加载表视图,从而导致未命中

我添加了一个false标志,在viewDidLoad中改为yes,在ViewDidDisplay中类似的东西可以解决这个问题。

In.h

#import "AppDelegate.h"

@interface ViewController : UITableViewController
{
    MBProgressHUD *progressHUD;
    ASAppDelegate *appDelegate;
}
In.m

[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
appDelegate = (ASAppDelegate *) [UIApplication sharedApplication].delegate;
progressHUD = [MBProgressHUD showHUDAddedTo:appDelegate.window animated:YES];
progressHUD.labelText = @"Syncing To Sever";
[appDelegate.window addSubview:progressHUD];

一个简单的修复方法是为HUD视图的z索引提供一个较大的值,确保它位于所有其他子视图的前面

查看此答案,了解如何编辑UIView的z索引:。

这应该可以

  [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
要删除,您可以尝试

  [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];

“将HUD直接添加到窗口”是什么意思<代码>[self.view.window addSubview:HUD]似乎不起作用。我试着换成UIViewController,它显示的HUD很好,但出于某种原因,我的UITableView的所有元素都显示在一个相当大的表的底部。当我将其更改回UITableViewController时,内容再次正确显示。“似乎无法正常工作”以何种方式显示?我想它应该很好用。我不确定您使用UIViewController有什么问题,但请确保您的自动调整大小掩码设置正确。我只是删除了该视图,并在Interface Builder中重新创建了它,由于某种原因,它这次起了作用(作为UIViewController)。谢谢你,伙计!很可能在ViewWill出现之前调用了self.view.window-在此之前它是零。感谢@jtbandes,您的解决方案i-e在self.view.window中添加HUD对我来说非常有用,但我仍然有一个问题,当我的应用程序加载第一个视图控制器i-e rootViewController时,它崩溃了。我不知道为什么会这样,有人能告诉我问题出在哪里吗?TomSwift似乎是对的,即self.view.window为零,但无法找到解决方案。请帮助当需要的子视图被传递到方法中时,为什么要遍历每个子视图?因为tableview的工作方式和MBProgressHUD在添加任何单元格之前添加MBProgressView
[UIApplication sharedApplication].networkActivityIndicatorVisible = YES;
appDelegate = (ASAppDelegate *) [UIApplication sharedApplication].delegate;
progressHUD = [MBProgressHUD showHUDAddedTo:appDelegate.window animated:YES];
progressHUD.labelText = @"Syncing To Sever";
[appDelegate.window addSubview:progressHUD];
  [MBProgressHUD showHUDAddedTo:self.navigationController.view animated:YES];
  [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];