0

ユーザーが各セルを展開または折りたたむことができるように、セルの高さを追跡するための UITableViewproperty(strong, nonatomic)NSMutableArray *currentContentもあります。property(strong, nonatomic)NSMutableArray *cellHeightsself.currentContent、Web サービスからデータをロードする別のコントローラーによって設定されるため、データがロードされると変化します。これらの変数の両方を同期させたいと考えています。が更新され次第、currentContent更新したいと思いcellHeightsます。それ、どうやったら出来るの?

私は試した:

- (void)setCurrentContent:(NSMutableArray *)currentContent{
    _currentContent = currentContent;
    self.cellHeights = [NSMutableArray arrayWithDefaultHeightsForCellCount:[currentContent count]];
}

currentContentしかし、それは機能していません。最初に設定したとき、空のときにのみ設定されるからです。したがってself.cellHeights、現在は空のままになります。最終的に値が にある場合はself.currentContentself.cellHeights更新されませんでした。

4

2 に答える 2

1

Web サービスのコンテンツに応じて可変セルの高さを使用して、以前に同様のことを行ったことがあります。

私がしたことは、セルの高さを計算するためだけに使用する viewDidLoad: メソッドで「偽の」セルを作成することでした。

次に、「heightForRowAtIndexPath」メソッドを使用して、「偽の」セルにインデックス パスのデータを入力し、そのセルの高さを調べて、セルの高さを指定します。例えば:

@interface MyTableViewController()

@property (nonatomic, strong ) MyCustomTableViewCell *cellForTestingHeight;

@end




@implementation MyTableViewController

- (void)viewDidLoad {
   [super viewDidLoad]

   self.cellForTestingHeight = [[MyCustomTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault];
}

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSDictionary *myData = [self.data objectAtIndex:indexPath.row];
    self.cellForTestingHeight.viewData = myData;

    return self.cellForTestingHeight.height;
}

@end

このコードは、viewData プロパティを設定するメソッドを持つ MyCustomTableViewCell というクラスを作成し、そのプロパティを設定した後、height プロパティにアクセスすることでそのセルの高さを知ることができることを前提としています。

于 2013-06-18T01:51:59.280 に答える
0

あなたがする必要があるのは、配列を参照するプロパティではなく、可変配列自体の変更を観察することです。これは簡単なはずですが、残念ながらひねりがあります...

OK、ひねりがなく、NSMutableArrayあなたのプロパティが type であると仮定しましょうMyObservableClass。次に、観察をセットアップするには、次のようにします(すべてのコードは疑似です-つまり、回答に入力されます):

- (void)setCurrentContent:(MyObservableClass *)currentContent
{
   if(_currentContent)
      [_currentContent removeObserver:self forKeyPath:@"myObservableProperty"];

   _currentContent = currentContent;
   [_currentContent addObserver:self forKeyPath:@"myObservableProperty" ...];
}

が変更されるたびに、currentContentコードは古い値のプロパティの監視を停止し、新しい値のプロパティの監視を開始します。

簡単ですが、配列の場合はそれほど単純ではありません...

KVO はコレクションへの追加、削除、および変更をオブザーバーに通知しますが、NSMutableArrayクラスはそれらの通知を発行しません。配列にはプロキシを使用する必要があり、そのようなプロキシはフレームワークによって提供されます。たとえばNSArrayController、 およびを参照してくださいmutableArrayValueForKey:。ただし、ひねりの 2 番目の部分は、配列への変更はこのプロキシを介して行う必要があるということです。それを監視する場合、クライアントに呼び出しsetCurrentContentて渡すことはできません。クライアントはプロキシを渡す必要があります。 NSMutableArray. これを設計で簡単に使用できるかどうかを判断する必要があります。これを整理するには、このドキュメントの自動変更通知と他の Apple ドキュメントを読む必要があります。

これは必要以上に複雑に聞こえますが、他の誰かがこれを行うためのより簡潔な方法を提供するかもしれません。

于 2013-06-18T03:42:45.317 に答える