Obj-c - NSArray свойство появляется NULL в numberOfRowsInSection, но не в viewDidLoad? - PullRequest
0 голосов
/ 01 декабря 2018

Я пытаюсь создать новый массив, отфильтровав self.neighbourData в self.closeByNeighbours (новый массив), и все работает отлично - данные отображаются так, как и должно быть в viewDidLoad.Однако при попытке вернуть количество ячеек для self.closeByNeighbours счетчик NSArray возвращает значение NULL?Есть идеи, почему это так?

ViewController.h

@property (strong, nonatomic) NSArray *closeByNeighbours;
@property (strong, nonatomic) NSMutableArray *neighbourData;

ViewController.m

    -(void)viewDidLoad {

      NSMutableDictionary *viewParams = [NSMutableDictionary new];
        [viewParams setValue:@"u000" forKey:@"view_name"];
        [DIOSView viewGet:viewParams success:^(AFHTTPRequestOperation *operation, id responseObject) {


            self.neighbourData = [responseObject mutableCopy];
             [self.neighboursView reloadData];


            NSDictionary *userDictInfo = (NSDictionary*) [NSKeyedUnarchiver unarchiveObjectWithData:[[NSUserDefaults standardUserDefaults] objectForKey:@"diosSession"]];

            DIOSSession *session = [DIOSSession sharedSession];
            [session setUser:userDictInfo];


            [session user];


            NSString *myData = [session user][@"user"][@"field_province"][@"und"][0][@"safe_value"];

            self.closeByNeighbours = [self.neighbourData filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(province contains[c] %@)", myData]];



        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            NSLog(@"Failure: %@", [error localizedDescription]);
        }];

    }

- (NSInteger) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{


    if (tableView == self.neighboursView) {

        return [self.closeByNeighbours count];


    }

}

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Каркас неявно перезагружает табличное представление после того, как представление загрузило .

В этот момент closeByNeighbours объявлено, но не инициализировано, поэтому оно nil.

Блок завершения в viewGet вызывается намного позже.

Решение, которого следует избегать nil, состоит в инициализации массива в начале viedDidLoad

-(void)viewDidLoad {
    [super viewDidLoad];
    self.closeByNeighbours = [NSArray array];
    ...

И у вас естьперезагрузить табличное представление в главном потоке в обработчике завершения

...
self.closeByNeighbours = [self.neighbourData filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(province contains[c] %@)", myData]];
dispatch_async(dispatch_get_main_queue(), ^{
    [self.tableView reloadData];
});
0 голосов
/ 01 декабря 2018

Я думаю, что вы забыли инициализировать closeByNeighbours.Попробуйте добавить.

NSString *myData = [session user][@"user"][@"field_province"][@"und"][0][@"safe_value"];
self.closeByNeighbours = [NSArray array: filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"(province contains[c] %@)", myData]];

Или как хотите, вам просто нужно инициализировать свойство closeByNeighbours.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...