I've been working on this project to expand my portfolio. I am still rather new to objective-c, so help would be highly appreciated!
I have been tinkering with this code for a few days now. I am aware the labels work, as I was able to get all the cells to display the same information (not the desired result). This was likely to a fault where my array didn't store all the objects.
Below is the code for my UIViewController;
INITIAL PROBLEM
So I have confirmed that the NSLog, displays 8 objects which is what I aiming for.
@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]);
}
However, when I use the method for deciding how many cells I want, through the array count I achieve 0 cells on the UICollectionView? Which is confusing as the NSLog confirms that there are 8 objects.
-(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return [self.eventTitleArray count];
}
This is the code relative to the UIViewControllerCell and assigning the arrays to the cells respective 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;
}
My Suspicions
I'm trying to sense the logic behind the problem. And I'm not sure if it goes down to the fact the UICollectionView methods are called before the viewDidLoad? I mean in the viewDidLoad the array evidently through NSLog has 8 objects in it, yet when tinkering with the methods relative to the UICollectionView/Cells they seem to be empty??
UPDATED
Below is the code which relates to the dictionary from which the Array is getting assigned information to;
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
I figured out your problem.
- (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];
...
}
Note that you are re-declaring all the variables again in your viewDidLoad
function. This hides your properties, and hence they are never really initialised. Once you declare them in your class definition, you can use self.eventTitleArray = [[NSMutableArray alloc] init...]
instead.
I would suggest something like:
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]);
}
You could then use [NSDictionary objectForKey:@""]
to access the required data point at a future time. It also means, you only have to manage one array that has all your information. Qualitatively, it will not affect your program logic at all