1

セルが取り込まれた UICollectionView があり、各セルにはグラデーション ボタンがあります (MKgradientbutton https://github.com/mikekatz/iOS-UI-Utils/tree/master/Classes/Button%20Widgets)。ビューは、5 つの他のボタンのいずれかを押すことによって「変更」されます。これにより、ボタンのデータが、uicollectionview のデータソースを提供する配列にロードされます。パラメータの 1 つはグラデーション ボタンの色です。ただし、データソースをリロードして [self.collectionView reloadData] を実行すると、ボタンのタイトルとその他のパラメーターが変更されますが、色が完全に間違ったものに変更されることがよくあります。データを繰り返し再ロードするとこの問題は解決しますが、さらに奇妙なことに、ボタンを 1 回押すだけでボタンの色が修正されるようです。reloadData が実行される前に行のデータソース配列を NSLogged しましたが、すべての色が正しいです。以下にいくつかのコードを貼り付けました。アプリはまだ開発の初期段階にあるため、ご容赦ください。

コードに問題は見当たりません。UICollectionView には「再描画」が必要だと思いますが、[self.CollectionView reloadData] で解決できると思います。

sqlite db からオブジェクトにデータをプルしてから、配列に追加します。

 Bird *bird = [[Bird alloc] init];

    bird.birdName = [results stringForColumn:@"name"];

    bird.buttonColour = [results stringForColumn:@"btncolour"];

[birds addObject:bird];

UICollectionView の設定に使用されている配列「birds」:

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView2         cellForItemAtIndexPath:(NSIndexPath *)indexPath
{
    CollectionViewCell *cell = [collectionView2     dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    Bird *bird = [birds objectAtIndex:(indexPath.row)];

    //Check button colour against index path of item
    NSLog(@"****INDEX PATH %i",indexPath.section*2 + indexPath.row);
    NSLog(@"****colour %@",bird.buttonColour);


    [cell.button setTitle:bird.birdName forState:UIControlStateNormal];
    [cell.button setTag:[birds indexOfObject:bird]];

    if ([bird.buttonColour isEqualToString:@"Green"]) {

 [cell.button setButtonColor:[UIColor greenColor]];

    }

    if ([bird.buttonColour isEqualToString:@"Orange"]) {

   [cell.button setButtonColor:[UIColor orangeColor]];
    }

    if ([bird.buttonColour isEqualToString:@"Red"]) {

      [cell.button setButtonColor:[UIColor redColor]];
    }

    if ([bird.buttonColour isEqualToString:@"Blue"]) {

   [cell.button setButtonColor:[UIColor blueColor]];
    }




    cell.button.titleLabel.numberOfLines = 0;
    cell.button.titleLabel.lineBreakMode = NSLineBreakByWordWrapping;
    cell.button.titleLabel.textAlignment = NSTextAlignmentCenter;


      return cell; }

collectionViewCell.h (グラデーション ボタンはセル内の唯一の項目です):

#import <UIKit/UIKit.h>
#import "MKGradientButton.h"

@interface CollectionViewCell : UICollectionViewCell


@property (nonatomic) IBOutlet MKGradientButton* button;


@end
4

1 に答える 1

0

を介してボタン自体を再描画するように指示する必要がある場合があります[cell.button setNeedsDisplay]

于 2012-11-19T19:34:06.557 に答える