0

私はこのプロジェクトを進めてポートフォリオを拡張しています。私はまだ客観的に新しいです - C、ので、非常に感謝されるでしょう!NSArrayにはオブジェクトがありますが、UICollectionViewが空になっています

私はこのコードを数日間使っています。私は、すべてのセルに同じ情報(希望の結果ではない)を表示させることができたので、ラベルが機能することを認識しています。これは私の配列がすべてのオブジェクトを格納していなかったという障害になりそうです。

以下は私のUIViewControllerのコードです。

最初の問題

だから私はのNSLogは、私の目指すものです8つのオブジェクトが表示されていることを確認しました。

@interface YourDowey() 

@property (nonatomic, strong) NSMutableArray *eventTitleArray; 
@property (nonatomic, strong) NSMutableArray *eventLocationArray; 
@property (nonatomic, strong) NSMutableArray *eventIconArray; 
@property (nonatomic, strong) NSMutableArray *eventPriceArray; 
@property (nonatomic, strong) NSMutableArray *eventTypeArray; 


@end 

@implementation YourDowey 

- (void)viewDidLoad { 
[super viewDidLoad]; 

NSMutableArray *eventTitleArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventLocationArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventIconArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventPriceArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventTypeArray = [[NSMutableArray alloc]initWithCapacity:8]; 

for (NSUInteger index = 0; (index < 8) ; index++){ 

    EventsList *eventList = [[EventsList alloc] initWithIndex:index]; 

    NSString *individualEventTitle = eventList.eventTitle; 
    NSString *individualEventLocation = eventList.eventLocation; 

    NSString *individualEventIcon = eventList.eventIcon; 
    NSString *individualEventPrice = eventList.eventPrice; 
    NSString *individualEventType = eventList.eventType; 

    [eventTitleArray addObject:individualEventTitle]; 
    [eventLocationArray addObject:individualEventLocation]; 
    [eventIconArray addObject:individualEventIcon]; 
    [eventPriceArray addObject:individualEventPrice]; 
    [eventTypeArray addObject:individualEventType]; 

    } 
NSLog(@"Events: %@", eventTitleArray); 
NSLog(@"Number of objects: %lu", (unsigned long)[eventTitleArray count]); 
} 

しかし、私が望むセルの数を決定する方法を使用すると、配列数によってUICollectionViewで0個のセルが得られますか? NSLogが8つのオブジェクトがあることを確認すると混乱します。

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

これはUIViewControllerCellにコードに対して、細胞それぞれUIObjectクラス(ラベル/画像)にアレイを割り当てます。

-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{ 
EventsCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"eventsCell" forIndexPath:indexPath]; 

NSString *imagesString = [self.eventIconArray objectAtIndex:indexPath.row]; 

cell.eventImage.image = [UIImage imageNamed:imagesString]; 
cell.eventTitle.text = [self.eventTitleArray objectAtIndex:indexPath.row]; 
cell.eventLocation.text = [self.eventLocationArray objectAtIndex:indexPath.row]; 
cell.eventPrice.text = [self.eventPriceArray objectAtIndex:indexPath.row]; 
cell.eventType.text = [self.eventTypeArray objectAtIndex:indexPath.row]; 

return cell; 
} 

私の疑惑

は、私は問題の背後にあるロジックを感知しようとしています。そして、UICollectionViewメソッドがviewDidLoadの前に呼び出されているという事実になるかどうかはわかりません。私はviewDidLoadには、NSLogを使って明らかに配列に8つのオブジェクトがありますが、UICollectionView/Cellに関連したメソッドを使っていないと、空であるようですね??

以下

が配列情報を割り当て取得された辞書に関するコードする更新済み。

EventsLibrary.h

#import <Foundation/Foundation.h> 

extern NSString *const kTitle; 
extern NSString *const kLocation; 
extern NSString *const kPrice; 
extern NSString *const kIcon; 
extern NSString *const kLargeIcon; 
extern NSString *const kType; 

@interface EventsLibrary : NSObject 

@property (strong, nonatomic) NSArray *library; 

@end 

EventsLibrary.m

#import "EventsLibrary.h" 

NSString *const kTitle = @"title"; 
NSString *const kLocation = @"location"; 
NSString *const kPrice = @"price"; 
NSString *const kIcon = @"icon"; 
NSString *const kLargeIcon = @"largeIcon"; 
NSString *const kType = @"type"; 

@implementation EventsLibrary 

-(instancetype) init{ 
self = [super init]; 
if (self) { 
    _library  = @[  @{ kTitle:@"iCafe de Paris", 
            kLocation:@"International Drive", 
            kPrice:@"$10", 
            kIcon:@"iCafe.png", 
            kLargeIcon:@"iCafeLrg.png", 
            kType:@"Food"}, 

           @{ kTitle:@"Orlando's Museum of Art", 
            kLocation:@"N Mills Ave", 
            kPrice:@"$20", 
            kIcon:@"Museum.png", 
            kLargeIcon:@"MuseumLrg.png", 
            kType:@"Art"}, 

           @{ kTitle:@"Club 180", 
            kLocation:@"W Church Street", 
            kPrice:@"$20", 
            kIcon:@"Club180.png", 
            kLargeIcon:@"Club180Lrg.png", 
            kType:@"NightLife"}, 

           @{ kTitle:@"Wekiva Springs", 
            kLocation:@"Wekiva Circle, Apopka", 
            kPrice:@"$5", 
            kIcon:@"Wekiva.png", 
            kLargeIcon:@"WekivaLrg.png", 
            kType:@"Nature"}, 

           @{ kTitle:@"Kings Bowling", 
            kLocation:@"International Drive", 
            kPrice:@"$10", 
            kIcon:@"Kings.png", 
            kLargeIcon:@"KingLrg.png", 
            kType:@"Sports"}, 

           @{ kTitle:@"Pirate's Cove Mini Golf", 
            kLocation:@"International Drive", 
            kPrice:@"$15", 
            kIcon:@"PiratesGolf.png", 
            kLargeIcon:@"PiratesGolfLrg.png", 
            kType:@"Sports"}, 

           @{ kTitle:@"Cobb's Plaza Cinema", 
            kLocation:@"S Orange Ave", 
            kPrice:@"$8", 
            kIcon:@"Cobbs.png", 
            kLargeIcon:@"CobbsLrg.png", 
            kType:@"Art"}, 

           @{ kTitle:@"Mango's Cafe", 
            kLocation:@"International Drive", 
            kPrice:@"FREE", 
            kIcon:@"Mangos.png", 
            kLargeIcon:@"MangosLrg.png", 
            kType:@"Food"} 
          ]; 
} 
return self; 
} 

@end 

EventsList.h

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 
#import "EventsLibrary.h" 

@interface EventsList : NSObject 

@property (strong, nonatomic) NSString *eventTitle; 
@property (strong, nonatomic) NSString *eventLocation; 
@property (strong, nonatomic) NSString *eventPrice; 
@property (strong, nonatomic) NSString *eventIcon; 
@property (strong, nonatomic) NSString *eventIconLarge; 
@property (strong, nonatomic) NSString *eventType; 

- (instancetype)initWithIndex:(NSUInteger)index; 

@end 

EventsList.m

#import "EventsList.h" 

@implementation EventsList 

-(instancetype)initWithIndex:(NSUInteger)index{ 
self = [super init]; 
if (self) { 

    EventsLibrary *eventsLibrary = [[EventsLibrary alloc]init]; 
    NSArray *library = eventsLibrary.library; 

    NSDictionary *eventsDictionary = library[index]; 

    _eventTitle = [eventsDictionary objectForKey:kTitle]; 
    _eventLocation = [eventsDictionary objectForKey:kLocation]; 
    _eventPrice = [eventsDictionary objectForKey:kPrice]; 

    NSString *iconName = [eventsDictionary objectForKey:kIcon]; 
    _eventIcon = [UIImage imageNamed:iconName]; 

    NSString *largeIconName = [eventsDictionary objectForKey:kLargeIcon]; 
    _eventIconLarge = [UIImage imageNamed:largeIconName]; 

    _eventType = [eventsDictionary objectForKey:kType]; 
} 
return self; 
} 

@end 
+0

あなたのコードはどこに 'self.eventTitleArray'ですか?あなたが投稿したコードは、同じ名前の別のローカルの配列変数に値を設定します。 – rmaddy

+0

なぜ5つの別々のアレイがありますか?イベントオブジェクトの配列が1つだけではないのはなぜですか? – rmaddy

+0

@rmaddyと同意します。 ImageName、Title、Location、PriceおよびTypeをそれぞれ含むNSDictionaryオブジェクトを実装した配列を1つ使用することを検討してください。 – Tcharni

答えて

0

私はあなたの問題を考え出しました。あなたはviewDidLoad機能で再びすべての変数を再宣言している

- (void)viewDidLoad { 
[super viewDidLoad]; 

NSMutableArray *eventTitleArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventLocationArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventIconArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventPriceArray = [[NSMutableArray alloc]initWithCapacity:8]; 
NSMutableArray *eventTypeArray = [[NSMutableArray alloc]initWithCapacity:8]; 
... 
} 

注意。これはあなたの特性を隠すので、実際には初期化されません。クラス定義で宣言したら、代わりにself.eventTitleArray = [[NSMutableArray alloc] init...]を使用できます。あなたは、将来の時点で必要なデータポイントにアクセスするために[NSDictionary objectForKey:@""]を使用することができ

NSMutableArray *eventArray; //One single array for all 

- (void)viewDidLoad { 
[super viewDidLoad]; 

self.eventArray = [[NSMutableArray alloc]initWithCapacity:8]; 

for (NSUInteger index = 0; (index < 8) ; index++){ 

    EventsList *eventList = [[EventsList alloc] initWithIndex:index]; 

    NSString *individualEventTitle = eventList.eventTitle; 
    NSString *individualEventLocation = eventList.eventLocation; 

    NSString *individualEventIcon = eventList.eventIcon; 
    NSString *individualEventPrice = eventList.eventPrice; 
    NSString *individualEventType = eventList.eventType; 

    NSDictionary *eventDictionary = [[NSDictionary alloc] initWithObjectsAndKeys: eventList.eventTitle, @"Title", eventList.eventLocation, @"Location", eventList.eventIcon, @"Icon", eventList.eventPrice, @"Price, eventList.eventType, @"Type", nil]; 

    [eventArray addObject:eventDictionary]; 

    } 
NSLog(@"Events: %@", eventArray); 
NSLog(@"Number of objects: %lu", (unsigned long)[eventArray count]); 
} 

私のようなものをお勧めします。また、すべての情報を持つ1つのアレイを管理するだけで済みます。定性的には、あなたのプログラムロジックに全く影響しません

+0

したがって、viewDidLoad関数では、eventTitleArrayとself.eventTitleArrayは2つの異なる変数です。したがって、問題 – Tcharni

+0

ありがとうSOOOOO!あなたは天才です!そのような簡単な解決策!ありがとうございました!ありがとうございました!ありがとうございました! – FarisZ

+0

私は何度も同じミスを犯しました。あなたはちょうどその点を超えてそれに気を付けるようになります。 – Tcharni

関連する問題