28

したがって、インターネットからデータをロードし、ロードプロセス中にMBProgressHUDを使用するUITableViewControllerのサブクラスがあります。標準のMBProgressHUD初期化を使用します。

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

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

    [HUD show:YES];

結果は次のとおりです。

結果

この問題を解決する方法はありますか、それともMBProgressHUDを放棄する必要がありますか?

ありがとう!

4

10 に答える 10

41

私の解決策は非常に単純でした。自分のビューを使用する代わりに、自分のnavigationControllerのビューを使用しました。

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

彼の写真は彼がを使用していることを示しているので、これはOPで機能するはずUINavigationControllerです。がない場合はUINavigationController、UITableViewの上に別のビューを追加し、それにHUDを追加することができます。この余分なビューを表示/非表示にするには、少し余分なコードを記述する必要があります。

この単純なソリューションの不幸な点(上記の別のビューを追加する私のアイデアは数えません)は、HUDが表示されている間はユーザーがナビゲーションコントロールを使用できないことを意味します。私のアプリの場合、それは問題ではありません。ただし、長時間実行する操作があり、ユーザーが[キャンセル]を押したい場合は、これは適切な解決策ではありません。

于 2012-01-06T08:01:18.207 に答える
15

これself.viewはおそらく、UITableViewがヘッダーを含むサブビューを動的に追加/削除する可能性があるためです。これは、サブビューとして追加した後、HUDの上に配置される可能性があります。HUDをウィンドウに直接追加するか、(もう少し作業が必要ですが、おそらくより良い結果が得られるように)テーブルビューとHUDビューの両方を含むプレーンビューを持つUIViewControllerサブクラスを実装する必要があります。そうすれば、HUDをテーブルビューの上に完全に配置できます。

于 2011-08-26T03:25:34.540 に答える
3

私の解決策は次のとおりです。

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

UITableViewControllerを含むすべてのシナリオの魅力のように機能します。これが他の誰かに役立つことを願っています。ハッピープログラミング:)

于 2012-05-16T14:53:38.383 に答える
2

UITableViewにカテゴリを作成して、MBProgressHUDを前面に表示します。これにより、常に「上」に表示され、アクションに時間がかかる場合は、ユーザーがアプリ内の他のコントロール(戻るボタンなど)を使用できるようになります(例えば)

#import "UITableView+MBProgressView.h"

@implementation UITableView (MBProgressView)


- (void)didAddSubview:(UIView *)subview{
    for (UIView *view in self.subviews){
        if([view isKindOfClass:[MBProgressHUD class]]){
            [self bringSubviewToFront:view];
            break;
        }
    }
}

@end
于 2013-06-15T18:30:59.687 に答える
2

簡単な修正は、HUDビューのz-indexに大きな値を与え、他のすべてのサブビューの前に配置されるようにすることです。

UIViewのz-indexを編集する方法については、この回答を確認してください:https ://stackoverflow.com/a/4631895/1766720 。

于 2014-08-20T22:16:46.750 に答える
1

私は数分前に同様の問題に踏み込み、別の(そして私見よりエレガントな)方法で正しい方向に向けられた後、それを解決することができました:

サブクラスの実装の最初に 次の行を追加します。UITableViewController

@synthesize tableView;

次のコードをサブクラスのメソッドの先頭にinit追加します(メソッドの先頭も機能する可能性がありますが、メソッドをお勧めします)。UITableViewControllerinitWithNibName:bundle:viewDidLoadinit

if (!tableView &&
    [self.view isKindOfClass:[UITableView class]]) {
    tableView = (UITableView *)self.view;
}

self.view = [[UIView alloc] initWithFrame:[UIScreen mainScreen].applicationFrame];
self.tableView.frame = self.view.bounds;
self.tableView.contentInset = UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0);
[self.view addSubview:self.tableView];

そうすれば、質問に投稿したコードを変更する必要がなくなります。上記のコードは基本的にself.tableViewfromを分離していself.viewます(これは以前と同じオブジェクトへの参照でしたself.tableViewが、現在はUIView予想どおりにテーブルビューが含まれています)。

于 2013-03-07T14:18:33.817 に答える
1

私はその問題を手動で解決しました。ChrisBallingerが尋ねてから2年が経ちましたが、誰かがここで起こっていることに慣れているかもしれません。

UITableViewControllerで、viewDidLoadでHTTPメソッドを実行します。これはバックグラウンドで実行されているため、進行状況が表示されている間にテーブルビューが読み込まれ、ミスが発生します。

viewDidLoadでyesに変更されたfalseフラグを追加し、viewDidAppearでその問題を解決できるようなものを追加しました。

-(void) viewDidAppear:(BOOL)animated{
    if (flag) {
        [self requestSomeData];
    }
    flag = YES;
    [super viewDidAppear:animated];
}
于 2014-03-31T13:43:31.290 に答える
0

私は同じ問題を抱えていて、UITableViewControllerをサブビューとしてUITableViewを持つプレーンなUIViewControllerに変更することでこれを解決することにしました(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 category。その実装はここで見つけることができます:https ://gist.github.com/Tafkadasoh/5206130 。

于 2013-03-20T17:50:38.793 に答える
0

.hで

#import "AppDelegate.h"

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

.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];
于 2014-08-09T04:12:45.953 に答える
0

これは機能するはずです。

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

そして削除するには、試すことができます

  [MBProgressHUD hideHUDForView:self.navigationController.view animated:YES];
于 2017-02-01T09:08:59.747 に答える