1

問題

図に示すように、ビュー (A) の中に他のコントロールがあるコンテナー ビュー (B) があります。コンテナー ビュー (B) には、ビュー (A) でボタンが押されるたびに更新したいコレクション ビューが保持されます。

UICollectionViewの基本を確認しましたが、何か足りないと感じています。UIViewController 間で通信したいときの私の自然な反応は、コールバックまたは他のデリゲート メカニズムに基づいて何かを構築することです。車輪を再発明する前に、何か考えはありますか?

現在、ビューのボタンをクリックすると、コレクション データが更新され、コレクション ビューで setNeedsDisplay と reloadData を呼び出します (childViewControllers プロパティを介してアクセスします)。コンテナビュー自体でもsetNeedsDisplayを呼び出してみました(喜びはありません)。

ところで - 私は同様の SO の質問を確認しましたが、これは一致するユースケースを提供していませんが、この特定のタイプの問題に関する洞察の欠如を示しているようです (素晴らしい答えを見逃した場合はお知らせください):

ABCD

DVC分析

解決

以下に解決策を共有しましたが、追加の回答を歓迎します(特にそれがより良い方法である場合)

4

1 に答える 1

2

解決

コミュニティを検索した結果、このトピックに関するわずかな情報しか得られなかったので、解決策を共有します。データ コントローラーにコールバック関数を追加しました。次に、How to tell UICollectionView about your content を詳しく調べたところ、以下に示すようにデータソースを簡単に切り替えることができることに気付きました (両方を組み合わせました)。

UICollectionView を取得してそれ自体を更新する方法について言及されている複数のオプションに注意してください。

UICollectionView のヒント

詳細

データコントローラーの .h ファイル内

//@interface の上

typedef void (^CallbackBlock)();

// @interface 内

@property (strong, nonatomic) CallbackBlock onDataUpdated;

// データが変更されたデータ コントローラー メソッド内

[DataManager sharedManager].onDataUpdated(); //singleton, i know...

//上記のシングルトンの代替

__weak DataManager* weakSelf = [[DataManager alloc]init];
weakSelf.onDataUpdated();

//私の UIViewController (B) サブクラスで

@property (strong,nonatomic)DataManager* controller;

//私の見解では、UIVC をロードしました (B)

self.controller = [DataManager sharedManager];

__weak ProgressViewController* weakSelf = self;

self.controller.onDataUpdated = ^(){
    //perform my action
    [weakSelf setData:nil]; //remove existing data
    [weakSelf setData:[self getSomeData]]; //get some new data
    [[weakSelf progressCollectionView]reloadData]; 
    [[weakSelf progressCollectionView] setNeedsDisplay];
};

最終結果:

  1. UIVC (A) ボタンのクリックを受け取る
  2. Data Manager クラスは、ステップ 1 のメソッド実行の最後にデータ更新イベントを発生させます
  3. UIVC (B) は、UIVC (A) の他のサブビューを更新せずにデータを即座に再読み込みします。
于 2014-04-03T19:33:07.213 に答える