NSArray 有对象但 UICollectionView 显示为空

NSArray has objects yet UICollectionView is appearing empty

我一直致力于这个项目以扩展我的投资组合。我对 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 (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;
}

我的猜测

我正在尝试理解问题背后的逻辑。而且我不确定这是否归结为 UICollectionView 方法在 viewDidLoad 之前调用的事实?我的意思是在 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:@"",
                                     kIcon:@"iCafe.png",
                                     kLargeIcon:@"iCafeLrg.png",
                                     kType:@"Food"},

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

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

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

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

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

                                @{   kTitle:@"Cobb's Plaza Cinema",
                                     kLocation:@"S Orange Ave",
                                     kPrice:@"",
                                     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

我解决了你的问题。

- (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 函数中再次重新声明所有变量。这会隐藏您的属性,因此它们永远不会真正初始化。在 class 定义中声明它们后,您可以改用 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:@""] 访问所需的数据点。这也意味着,您只需管理一个包含您所有信息的阵列。定性的,完全不会影响你的程序逻辑