0

最初に、答えが非常に明白である場合はお詫びしますが、私はiOS開発にまったく慣れていません(これは、私が遊んでいるだけなのに、プログラムしようとしている最初のアプリです:P)ので、私の問題がややマイナーはかなり高いです。

コード (xcode プロジェクトを含む zip ファイル) :

http://www.mediafire.com/?p55xw0q2dwwwwvm

他に有害なものは何もないと約束します:)。

問題:

私はフォローしています:

http://www.techotopia.com/index.php/An_iPhone_iOS_6_Storyboard-based_Collection_View_Tutorial

遊んでみる UICollectionView を作成しようとしています。「アプリケーションのテスト」セクションに進みました。ガイドのいくつかの部分に独自の解釈を加えました。

  1. 別の写真を使用する代わりに、下部に数字だけのラベルが付いた 1 つの写真を使用します。数は動的に設定されます。はい、使用している配列なしで実装できますが、その配列があると、将来このプロジェクトの範囲を拡張する場合に役立ちます。

  2. viewDidLoad にコードを追加して、ビュー レイアウトをフロー レイアウトに設定しました。これは、基本的なフォームでこれが機能するようになったら、flowlayout をサブクラス化する必要がある書式設定をいじりたいので、将来の保証のために再度行われました。

コードはエラーなしでコンパイルされますが、画面には何も表示されません。約 1 時間か 2 時間、できる限りコードをチェックしましたが、何の違いもありませんでした。私のコントローラ クラスは、コレクション ビューを画面に表示するための必要最小限の試みであり、セル クラスは、イメージビューとラベルだけを含む必要最小限のセルです。

これを機能させるために与えられた助けに感謝します!

tl;dr 太字のものを見てください。便宜上、以下にコードを示します。

MyCollectionViewController.m

#import "MyCollectionViewController.h"

    @interface MyCollectionViewController ()
    @property (nonatomic, strong) NSMutableArray *dataArray;
    @end

    @implementation MyCollectionViewController

    @synthesize dataArray = _dataArray;

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    {
        self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
        if (self) {
            // Custom initialization
        }
        return self;
    }

    - (void)viewDidLoad
    {
        [super viewDidLoad];

        // Create data to display
        for(int i = 0; i < 50; i++){
            [self.dataArray addObject:[NSString stringWithFormat:@"%d", i]];
        }

        // Configure Layout
        UICollectionViewFlowLayout *flowLayout = [[UICollectionViewFlowLayout alloc] init];
        [flowLayout setScrollDirection:UICollectionViewScrollDirectionHorizontal];
        [self.collectionView setCollectionViewLayout:flowLayout];

    }

    - (void)didReceiveMemoryWarning
    {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }

    #pragma mark -
    #pragma mark UICollectionViewDataSource

    -(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
    {
        return 1;
    }

    -(NSInteger)collectionView:(UICollectionView*)collectionView numberOfItemsInSection:(NSInteger)section
    {
        return [self.dataArray count];
    }

    -(UICollectionViewCell*)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath
    {
        MyCollectionViewCell *myCell = [collectionView dequeueReusableCellWithReuseIdentifier:@"MyCell" forIndexPath:indexPath];
        int row = [indexPath row];
        UIImage* image = [UIImage imageNamed:@"200px-AND_ANSI"];
        myCell.cellTitle = [self.dataArray objectAtIndex:row];
        myCell.cellImageView.image = image;
        myCell.backgroundColor = UIColor.whiteColor;

        return myCell;
    }

MyCollectionViewcontroller.h

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

@interface MyCollectionViewController : UICollectionViewController <UICollectionViewDataSource, UICollectionViewDelegate>

@end

MyCollectionViewCell.h

#import <UIKit/UIKit.h>

@interface MyCollectionViewCell : UICollectionViewCell
@property (strong, nonatomic) IBOutlet UIImageView *cellImageView;
@property (strong, nonatomic) IBOutlet UILabel *cellTitle;

@end

MyCollectionViewCell.m

#import "MyCollectionViewCell.h"

@implementation MyCollectionViewCell

@synthesize cellImageView = _cellimageView;
@synthesize cellTitle = _cellTitle;

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
    }
    return self;
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
    // Drawing code
}
*/

@end
4

1 に答える 1

1

self.dataArrayはコード内で割り当て/初期化されていないため、 と等しくなりnilます。メッセージの送信nilは許可されていますが、効果はありません。

for(int i = 0; i < 50; i++){
    [self.dataArray addObject:[NSString stringWithFormat:@"%d", i]];
}

self.dataArrayそのままnilで、[self.dataArray count]戻ります0

配列を割り当てて初期化する必要があります

self.dataArray = [[NSMutableArray alloc] init];

適切な場所は、View Controller の何らかのinitXXXメソッドです。ただしinitWithNibName:、View Controller がストーリーボード ファイルからインスタンス化されている場合は呼び出されないため、initWithCoder:代わりに次を使用する必要があります。

- (id)initWithCoder:(NSCoder *)coder
{
    self = [super initWithCoder:coder];
    if (self) {
        self.dataArray = [NSMutableArray array];
    }
    return self;
}
于 2013-01-21T06:20:43.377 に答える