NSArray有对象,但UICollectionView显示为空

时间:2017-07-17 03:21:17

标签: objective-c uicollectionview nsarray uicollectionviewcell

我一直致力于这个项目来扩展我的投资组合。我仍然对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

1 个答案:

答案 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:@""]在将来访问所需的数据点。这也意味着,您只需管理一个包含所有信息的阵列。定性地说,它不会影响你的程序逻辑