我一直致力于这个项目来扩展我的投资组合。我仍然对objective-c很新,所以非常感谢帮助!
我几天来一直在修改这段代码。我知道标签有效,因为我能够让所有单元格显示相同的信息(不是所需的结果)。这可能是我的数组没有存储所有对象的错误。
以下是我的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;
}
我的怀疑
我正试图感受问题背后的逻辑。而且我不确定它是否归结为在viewDidLoad之前调用UICollectionView方法的事实?我的意思是在viewDidLoad中,显然通过NSLog的数组中有8个对象,但是当修改相对于UICollectionView / Cells的方法时,它们似乎是空的?
已更新
以下是与字典有关的字典的代码;
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 :(得分:0)
我发现了你的问题。
- (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];
...
}
请注意,您要在viewDidLoad
函数中重新声明所有变量。这隐藏了您的属性,因此它们从未真正初始化。在类定义中声明它们后,您可以使用self.eventTitleArray = [[NSMutableArray alloc] init...]
代替。
我会建议像:
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]);
}
然后,您可以使用[NSDictionary objectForKey:@""]
在将来访问所需的数据点。这也意味着,您只需管理一个包含所有信息的阵列。定性地说,它不会影响你的程序逻辑