uicollectionviewcontroller objective-c uicollectionview nsarray uicollectionviewcell

objective c - uicollectionviewcontroller - NSArray tiene objetos, pero UICollectionView aparece vacío



uicollectionviewcell swift (1)

Descubrí tu problema.

- (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]; ... }

Tenga en cuenta que está volviendo a declarar todas las variables de nuevo en su función viewDidLoad . Esto oculta tus propiedades y, por lo tanto, nunca se inicializan realmente. Una vez que los declara en su definición de clase, puede usar self.eventTitleArray = [[NSMutableArray alloc] init...] lugar.

Sugeriría algo como:

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]); }

Luego puede usar [NSDictionary objectForKey:@""] para acceder al punto de datos requerido en el futuro. También significa que solo debe administrar una matriz que tenga toda su información. Cualitativamente, no afectará la lógica de su programa en absoluto

He estado trabajando en este proyecto para expandir mi cartera. Todavía soy bastante nuevo en Objective-C, ¡así que la ayuda sería muy apreciada!

He estado jugando con este código durante unos días. Soy consciente de que las etiquetas funcionan, ya que pude obtener todas las celdas para mostrar la misma información (no el resultado deseado). Probablemente fue un error donde mi matriz no almacenó todos los objetos.

Debajo está el código para mi UIViewController;

PROBLEMA INICIAL

Así que he confirmado que NSLog muestra 8 objetos, que es lo que pretendo.

@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]); }

Sin embargo, cuando uso el método para decidir cuántas células quiero, a través del recuento de matriz, ¿alcanzo 0 celdas en UICollectionView? Lo cual es confuso ya que NSLog confirma que hay 8 objetos.

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

Este es el código relativo a UIViewControllerCell y la asignación de las matrices a las celdas respectivas UIObject (label / image).

-(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; }

Mis sospechas

Intento sentir la lógica detrás del problema. Y no estoy seguro de si se debe a que los métodos UICollectionView son llamados antes de viewDidLoad? Quiero decir, en el viewDidLoad, la matriz, evidentemente, a través de NSLog tiene 8 objetos en ella, pero al jugar con los métodos relativos a UICollectionView / Cells parecen estar vacíos.

ACTUALIZADO

A continuación se muestra el código que se relaciona con el diccionario desde el que se le está asignando la información al Array;

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