2012-01-11 7 views
0

私は、押されたときに、セルを強調表示し、強調表示を解除するために、tableViewの右隅にUIBarButtonItemを作成しようとしています。UITableViewCellを取得するには、UIBarButtonItemをタップして背景色を変更しますか?

言い換えれば、ユーザーがボタンを押すと、セルの範囲が背景色を白から黄色に変更します。

私はそのボタンを押すたびにアプリがクラッシュするので、私はそれを作ることに失敗しています。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    UIBarButtonItem *barButton; 
    barButton = [[[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"high.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(colorCells:)] autorelease]; 
    self.navigationItem.rightBarButtonItem = barButton; 
} 

そしてここに、それはセルの範囲ハイライトにするために:私は失敗しています

- (void) colorCells:(id)sender 
{ 
    UITableViewCell *cell; 
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
     cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
     cell.imageView.image = [UIImage imageNamed:@"hot.png"]; 

    } 
    else { 
     cell.imageView.image = nil; 
     cell.backgroundColor = [UIColor whiteColor]; 
    } 
} 

ここで私は、ボタンを作成するために使用しているコードですか?それはうまく動作するはずです。または?何か不足していますか?ビューはUITableViewControllerです。

EDIT

私はそうのように私のコードを変更:

- (void) colorCells:(id)sender{ 
    UITableViewCell *cell; 
    NSInteger nSections = [self.tableView numberOfSections]; 
    for (int j=0; j<nSections; j++) { 
     NSInteger nRows = [self.tableView numberOfRowsInSection:j]; 
     for (int i=0; i<nRows; i++) { 
      NSIndexPath *indexPath = [NSIndexPath indexPathForRow:i inSection:j]; 
      cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
     } 
     NSString *cellValue = cell.textLabel.text; 
     if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
      cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
      cell.imageView.image = [UIImage imageNamed:@"hot.png"]; 

     } 
     else { 
      cell.imageView.image = nil; 
      cell.backgroundColor = [UIColor whiteColor]; 
     } 
     [self.tableView reloadData]; 

    } 
} 

今ではクラッシュしないが、それはあまりにも背景に色をしませ​​ん。何か案は?

+0

[self.tableView beginUpdates];を追加してください。および[self.tableView endUpdates];最後に – Novarg

+0

まだ選択されたセルを色付けできません。 :S – Phillip

答えて

1

セル内のテキストの背景色を基準にすると、非常に壊れやすいようです。セルをハイライトする必要があると判断するものは何ですか?それは変化しますか?確かに、背景の色は、データソース内のオブジェクトの特定のプロパティに対応しています。より堅牢なアプローチは、クラスのNSMutableIndexSetプロパティを使用して行インデックスのセットを追跡し、バーボタンをタップして強調表示する必要があります。

この例を検討してください。私はrowsToHighlightがあなたのクラスで宣言されたNSMutableIndexSetのインスタンスであり、ハイライトを必要とする行のインデックスで設定されていると仮定しています。提供されたインデックスパスがrowsToHighlightのメンバであるかどうかに応じて、セルの背景色を調整するために-tableView:willDisplayCell:forRowAtIndexPath:を実装します。

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([self.rowsToHighlight containsIndex:indexPath.row]) 
    { 
     cell.backgroundColor = [UIColor yellowColor]; 
    } 
} 

次に、バーボタンで発生したメソッドでは、空の更新ブロックを実行してテーブルをアニメーションでリロードするだけです。

- (void)colorCells:(id)sender 
{ 
    [self.tableView beginUpdates]; 
    [self.tableView endUpdates]; 
} 
+0

あなたの答えをありがとう。私はいくつかの質問がある。 NSMutableIndexSetは特定のセクションの特定の名前を含むセルだけを強調表示したいので、どのセルをハイライトしたいのかを知ることができます(行を追加して並べ替えると変更可能です)。私はバックグラウンドカラーを扱うためのボタンを作っていました。タップするとセルの背景が黄色になります。もう一度タップすると再び白くなります。 – Phillip

+0

それは私の主張です。どのような種類のオブジェクトを使用してテーブルビューを作成していますか?セルがハイライト表示されるべきかどうかを示す 'BOOL'を公開するいくつかの' NSObject'サブクラスなら、これは非常に簡単です。オブジェクト自体は、強調表示する必要があるかどうかを判断するために必要なすべてのロジックをカプセル化できます。テーブルビューのデータソースメソッド内の文字列を比較するのは、最高ではっきりしません。 –

+0

私は 'NSArray'と' NSDictionary'を使って自分のtVを設定しています。申し訳ありませんが、私はポイントを取得しない場合、私はこのdevの世界にはかなり新しいので、あなたがちょうど私のために少し混乱する可能性があります書いている! – Phillip

0

セルを再表示するようにテーブルビューに指示しない限り、セルは再描画されません。いくつかの方法のうちの1つでこれを行うことができます。 [someTableView reloadData]またはone of these methodsと考えることができます。

また、セルオブジェクトはテーブルビュー内のオブジェクトではありません。これを考慮するとよいでしょう:

- (void) colorCells:(id)sender 
{ 
    UITableViewCell *cell; 

    //grab a cell 
    cell = [self tableView:self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:someRow inSection:someSection]]; 
    NSString *cellValue = cell.textLabel.text; 
    if ([cellValue isEqual: @"textTheCellShouldBeEqualTo"]){ 
     cell.backgroundColor = [UIColor colorWithRed:251/255.0f green:255/255.0f blue:192/255.0f alpha:1]; ; 
     cell.imageView.image = [UIImage imageNamed:@"hot.png"]; 

    } 
    else { 
     cell.imageView.image = nil; 
     cell.backgroundColor = [UIColor whiteColor]; 
    } 

    //perhaps you need to reload the table as well 
    [self.tableView reloadData]; 
} 
+0

私は3つの別々の配列を持っている場合、 'cellForRowAtIndexPath'はどのように動作しますか?それぞれ可変数のセルを含んでいますか? (すなわち、 'FirstArray' = 13個のオブジェクト、' SecondArray' = 45個のオブジェクト、 'ThirdArray' = 20個のオブジェクト)どのパスを取るべきですか? – Phillip

+0

テーブルに一度に1つの配列を表示していますか、またはテーブルの各配列の一部ですか?インデックスパスは、テーブルのデリゲートにどの行とどのセクションにテーブルを与えるかを伝えるだけです。 – Moshe

+0

いいえ、各配列はテーブルの一部です。私は3つのセクションを持っています。最初のセクションは「FirstArray」に属し、2番目のセクションは 'SecondArray'に属し、3番目のセクションは' ThirdArray'に属します。 'indexPath'はそれでは何でしょうか? – Phillip

関連する問題