Ios UITableView标题显示在MBProgressHUD顶部
因此,我有一个子类UITableViewController,它从internet加载一些数据,并在加载过程中使用MBProgressHUD。我使用标准的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
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];