0

Table View Controller があり、それを Collection View Controller に変更したいのですが、アプリは JSON を使用して情報を取得します。

ストーリーボードに Collection View Controller を既に作成しました。私のView Controllerは「UpcomingReleasesViewController」と呼ばれ、「UpcomingReleaseCell」と呼ばれるUICollectionViewCellがあります。ストーリーボードには、「release_name」というコレクション セルにリンクされたラベルがあります。

TVC にあったコードを転送したいのですが、更新に問題があります。

UpcomingReleasesViewController.h に追加したコード (TVC にあったように)

@interface UpcomingReleasesViewController : UICollectionViewController

@property (strong, nonatomic) NSMutableArray *upcomingReleases;

@end

このコードを UpcomingReleasesViewController.m に追加しました ( cell.textLabel.textを呼び出すとエラーが発生します)

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSURL *upcomingReleaseURL = [NSURL URLWithString:@"http://obscure-lake-7450.herokuapp.com/upcoming.json"];

    NSData *jsonData = [NSData dataWithContentsOfURL:upcomingReleaseURL];

    NSError *error = nil;

    NSDictionary *dataDictionary = [NSJSONSerialization JSONObjectWithData:jsonData options:0 error:&error];

    self.upcomingReleases = [NSMutableArray array];

    NSArray *upcomingReleasesArray = [dataDictionary objectForKey:@"upcoming_releases"];

    for (NSDictionary *upcomingReleaseDictionary in upcomingReleasesArray) {
        UpcomingRelease *upcomingRelease = [UpcomingRelease upcomingReleaseWithName:[upcomingReleaseDictionary objectForKey:@"release_name"]];
        [self.upcomingReleases addObject:upcomingRelease];
    }
}

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"Cell";

    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];

    UpcomingRelease *upcomingRelease = [self.upcomingReleases objectAtIndex:indexPath.row];

    cell.textLabel.text = upcomingRelease.release_name;

    return cell;
}

また、TVC を使用していたときに、次のコードを含む「UpcomingRelease」という NSObject がありました。

UpcomingRelease.h

@interface UpcomingRelease : NSObject

@property (nonatomic, strong) NSString *release_name;

// Designated Initializer
- (id) initWithTitle:(NSString *)release_name;
+ (id) upcomingReleaseWithName:(NSString *)release_name;

@end

UpcomingRelease.m

@implementation UpcomingRelease

- (id) initWithTitle:(NSString *)release_name {
    self = [super init];

    if ( self ){
        self.release_name = release_name;
    }

    return self;
}

+ (id) upcomingReleaseWithName:(NSString *)release_name {
    return [[self alloc] initWithTitle:release_name];
}

@end

新しいアプリ用に NSObject を作成してそのコードを追加する必要がありますか?それとも UpcomingReleaseCell に追加する必要がありますか?

ありがとう。

4

2 に答える 2

1

カスタムセルを登録しましたか?

    [self.collectionView registerClass:[UpcomingReleaseCell class] forCellWithReuseIdentifier:@"UpcomingReleaseCell"];
于 2013-09-04T18:05:11.097 に答える
0
  1. ストーリーボードを使用する場合、セルを登録する必要はありません

  2. ストーリーボードから CollectionViewCell を選択し、ID インスペクターでクラスを「UpcomingReleaseCell」に変更します。

  3. コレクションビューセルにラベルを追加し、セルを「release_name」という名前の「UpcomingReleaseCell」に接続します

  4. 「cellForItemAtIndexPath」に以下を追加

    (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
    
    UpcomingReleaseCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"Cell" forIndexPath:indexPath];
    // Configure the cell
    
    UpcomingRelease *upcomingrelease = [self.upcomingReleases objectAtIndex:indexPath.row];
    
    cell.release_name.text = upcomingrelease.release_name;
    
    return cell;
    }
    
于 2016-01-28T12:41:41.367 に答える