1

Web 呼び出しが行われた後、各タブのタブ コンテンツを更新しようとしています。これを行うために非常に多くの異なる方法を試しましたが、数え切れませんでした。誰かがこれがどのように可能か教えてください。

Web 呼び出しは、サーバーから JSON を呼び出し、それを使用してタブのコンテンツを更新するだけです。テスト目的で、設定クラス内にボタンを設定しました。設定クラスは、ホーム タブ内のビューで、更新というボタンがあります。クリックすると、アプリケーションの起動時に Web 呼び出しから呼び出されるものとは異なる、デバイスに保存されている JSON が取得されます。これにより、サーバー上の JSON を変更する必要がなくなります。

私が試したいくつかのテクニックを紹介します。誰かが私が間違っていることを教えてくれたらありがたいです.

クラスのインスタンスを作って、このようにrefreshメソッドを呼び出してみました

DashboardVC *db = [[DashboardVC alloc] init];
[db refreshMe];

ダッシュボードクラスの更新方法はこちら

-(void) refreshMe
{     
     [self loadView];
     [self viewDidLoad];
}

しかし運がない。このメソッドは、Dashboard クラス内で呼び出すと機能しますが、別のクラスから呼び出すと機能しません。新しいクラスをインスタンス化し、その上でリフレッシュを呼び出すようになったと思います。だから私はそのテクニックをやめて、次の方法に移った

これはすべてのタブバーをループし、問題なくタブタイトルを変更するため、ViewControllers を適切にループしていることがわかります。

ViewDidAppear、viewWillAppearなどのビューメソッドもすべて試しましたが、うまくいきませんでした。

また、ダッシュボードクラスで作成したrefreshMeメソッドに、このようにtabControllerを介してアクセスしてみました

[[[self.tabBarController viewControllers] objectAtIndex:0] refreshMe];

しかし、やはりうまくいきません。これにより、アプリケーションがクラッシュするだけです。

このガイドを読みました

https://developer.apple.com/library/ios/#documentation/WindowsViews/Conceptual/ViewControllerPGforiOSLegacy/TabBarControllers/TabBarControllers.html

アップルのウェブサイトにありますが、個々のタブのコンテンツを更新する方法については触れていないようです。

私が望むのは、Web 呼び出しが行われた後に個々のタブのコンテンツを更新し、これを理解しようとして何年も費やしたことですが、何も機能していません。

誰かが私が間違っていることを教えてくれたら、とても感謝していますか?

事前にサンクス....

編集:

私が試したことを拡張する

Michael と話し合った結果、Apple のガイドラインに反して loadView を呼び出すべきではないことに気付きました。そのため、LoadView への参照をすべて削除しました。クラスのビュー、画像、テキストなどを設定する RefreshMe と呼ばれるすべてのメイン ViewControllers にメソッドを配置しました。そして、このメソッドは ViewDidLoad 内に配置されます。ここで、Web 呼び出しが行われた後にこれらのメソッドを呼び出せるようにして、アプリケーションを効果的に更新したいと考えています。

私の viewDidLoad は、すべてのメイン クラスで次のようになります。

- (void) viewDidLoad {
     [super viewDidLoad];
     [self refreshMe];
}  

そして、refreshMe メソッドには、画面を設定するコードが含まれています。

Web 呼び出しから取得された JSON データは、5 つのタブのそれぞれのコンテンツを設定するため、Web 呼び出しの後にすべてを更新する必要があります。

私はviewControllersをループしてviewDidLoadを呼び出してみました。これにより、クラスを設定するrefreshMeメソッドが呼び出されますが、何も起こりません。私が使用したコードはこれでした

NSArray * tabBarViewControllers = [self.tabBarController viewControllers];

for(UIViewController * viewController in tabBarViewControllers)
{
    [viewController viewDidLoad];
}

とりあえず私も入れました

NSLog(@"Method called"); 

各クラスの viewDidLoad で、それが呼び出されているかどうかをテストします。ただし、アプリケーションを最初にロードしたとき、またはアプリケーションを再入力したときにのみ、メッセージが出力されます。このメソッドは、設定画面の更新ボタンをクリックした後に呼び出される必要がありますが、呼び出されず、理由がわかりません。

なぜこれが機能しないのか、誰にも分かりますか?

4

2 に答える 2

1

質問とコメントから、少なくとも2つの問題があるように思われます。

  1. アプリのタブバーコントローラーによって管理されているビューコントローラーにアクセスできません。

  2. ビューコントローラの通常の動作に反しているようです。

最初の部分は簡単に整理できるはずです。オブジェクトへのポインタがある場合は、そのオブジェクトにメッセージを送信できます。対応するメソッドが実行されない場合は、ポインタが実行すると思われる場所を指していないか、オブジェクトに実行すると思われるメソッドがありません。あなたのコードを見てみましょう:

NSArray * tabBarViewControllers = [self.tabBarController viewControllers];

for(UIViewController * viewController in tabBarViewControllers)
{
    [viewController viewDidLoad];
}

このコードは-viewDidLoad、タブバーコントローラーによって管理されている各ビューコントローラーを呼び出すことになっています。それを行うための知恵はさておき、このコードは、あなたがそう思うオブジェクトを指していれば、期待どおりに機能するはずだと言えます。 self.tabBarControllerこのコードがアプリのどこにあるかはわかりません。アプリのデリゲートの一部なのか、問題のタブバーコントローラーによって管理されているビューコントローラーの一部なのか、それとも他の場所なのか。デバッガーを使用してコードをステップ実行します。最初の行の後に、tabBarViewControllersView Controllerの配列が含まれていますか?ビューコントローラの数は正しいですか、そしてそれらは期待されるタイプですか?ビューコントローラの-viewDidLoadメソッドが呼び出されていない場合は、答えが「いいえ」であるのは間違いないので、なぜそうではself.tabBarControllerないのかを理解してください。

-viewDidLoadさて、そもそも電話をかけるべきではないことを(マイケルがしたように)指摘する価値は確かにあります。ビューコントローラは、ビューを作成した後(.xib / storyboardファイルからロードするか、プログラムで作成した後)、そのメソッドを自身に送信します。自分自身を呼び出すと-viewDidLoad、ビューが作成される前に実行されるか、2回目に実行されますが、どちらも役に立ちません。

また、各ビューコントローラのビューをプリエンプティブに「更新」しようとしても意味がありません。アプリがWebサービス(または他の場所)からデータを取得している場合は、結果のデータを使用してモデル、つまりアプリが管理するデータオブジェクトを更新する必要があります。ビューコントローラを選択すると、タブバーコントローラがそのビューを表示し-viewWillAppear、ビューが表示される直前にビューコントローラのメソッドが呼び出されます。そのメソッドを使用して、モデルから必要なデータを取得し、ビューを更新します。このようにすると、次のことがわかります。

  • ビューコントローラのビューはすでに作成されています

  • 他のViewControllerのいずれかがデータを変更した場合でも、ビューに表示されるデータは最新のものになります。

  • ユーザーが決して見ることのないビューの更新に時間を費やすことはありません

同様に、ユーザーが表示されたデータに変更を加えることができる場合は、変更が行われたとき、またはView Controllerの-viewWillDisappearメソッドでモデルを更新して、次のViewControllerが正しいデータを処理できるようにする必要があります。

于 2012-05-21T09:53:33.783 に答える
1

タブ バーの順序を更新するときにビュー コントローラーを更新する代わりに、サブクラス化された UIViewController のviewWillAppear:メソッドを実装して、表示される直前にビューを更新してみませんか?

これが意味することは、ビューが表示されるたびに、新しいコンテンツと更新されたコンテンツのビューを更新できるということです。

于 2012-05-18T12:40:21.040 に答える