表视图中的 NSMutableArray 为空

Posted

技术标签:

【中文标题】表视图中的 NSMutableArray 为空【英文标题】:NSMutableArray null in tableview 【发布时间】:2019-08-30 00:25:58 【问题描述】:

我正在使用以下代码来确定我的登录用户与数据库中所有其他用户之间的距离。我成功地将找到的距离添加到 NSMutableArray finalDistances,但是我现在正尝试在标签 kmAway 的 tableview 单元格中显示这些距离。我想按照它们在每个单元格中返回的顺序显示它们。

也就是说,当我尝试按照 ViewController.m 中所示实现它时,self.finalDistances 在我的 tableview 中返回为 null,即使它已填充在 viewDidLoad 中。我怎样才能做到这一点?

ViewController.h

@property (nonatomic) CLLocationDistance kilometers;
@property (nonatomic) CLLocation *startLocation;
@property (nonatomic) CLLocation *endLocation;
@property (strong, nonatomic) NSMutableArray *finalDistances;

ViewController.m


NSString *myLocation = self.currentUser[0][@"street_address"];
NSLog(@"MY LOCATION %@", myLocation);

CLGeocoder *geocoder = [[CLGeocoder alloc] init];
[geocoder geocodeAddressString:myLocation completionHandler:^(NSArray* placemarks2, NSError* error) 
    for (CLPlacemark* aPlacemark in placemarks2)
            
        for (NSMutableDictionary *multiplelocationsFriend in self.closeByNeighbours) 

            NSString *location = [multiplelocationsFriend objectForKey:@"address"];

            CLGeocoder *geocoderFriend = [[CLGeocoder alloc] init];
            [geocoderFriend geocodeAddressString:location completionHandler:^(NSArray* placemarks, NSError* error) 
                if (placemarks && placemarks.count > 0) 
                    CLPlacemark *topResult = [placemarks objectAtIndex:0];
                    MKPlacemark *placemark = [[MKPlacemark alloc] initWithPlacemark:topResult];
                self.endLocation = [[CLLocation alloc] initWithLatitude:placemark.location.coordinate.latitude longitude:placemark.location.coordinate.longitude];

                NSString *myLocation = self.currentUser[0][@"street_address"];
                NSLog(@"MY LOCATION %@", myLocation);

                CLGeocoder *geocoder = [[CLGeocoder alloc] init];
                [geocoder geocodeAddressString:myLocation completionHandler:^(NSArray* placemarks2, NSError* error) 
                    for (CLPlacemark* aPlacemark in placemarks2)
                    
                        self.startLocation = [[CLLocation alloc] initWithLatitude:aPlacemark.location.coordinate.latitude longitude:aPlacemark.location.coordinate.longitude] ;
                        self.kilometers = [self.startLocation distanceFromLocation:self.endLocation] / 1000;
                        self.finalDistances = [NSMutableArray new];
                        [self.finalDistances addObject:[NSNumber numberWithDouble:self.kilometers]];
                        [self.neighboursView reloadData];
                    
                ];
            
        ];
    

];

dispatch_async(dispatch_get_main_queue(), ^
    [self.neighboursView reloadData];
);

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


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

    static NSString *NetworkTableIdentifier = @"sidebarCell";

    self.sidetableView.separatorStyle = UITableViewCellSeparatorStyleNone;

    sidebarCell *cell = (sidebarCell *)[tableView dequeueReusableCellWithIdentifier:NetworkTableIdentifier];
    if (cell == nil)
    
        NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"sidebarCell" owner:self options:nil];
        cell = [nib objectAtIndex:0];
    


    if (tableView == self.neighboursView)
       
        sidebarCell *cell = (sidebarCell *)[tableView dequeueReusableCellWithIdentifier:@"sidebarCell"];

        NSDictionary *userName = [self.closeByNeighbours objectAtIndex:indexPath.row];

        NSString *first = [userName objectForKey:@"first name"];
        NSString *last = [userName objectForKey:@"last name"];
        NSString *area = [userName objectForKey:@"neighbourhood"];
        NSString *city = [userName objectForKey:@"city"];

        NSDictionary *distances = [self.finalDistances objectAtIndex:indexPath.row];

        [[cell kmAway] setText:[NSString stringWithFormat:@"%@", distances]];

        [[cell areaLabel] setText:[NSString stringWithFormat:@"%@, %@", area, city]];

        NSDictionary *userBio = [self.closeByNeighbours objectAtIndex:indexPath.row];

        [[cell username] setText:[NSString stringWithFormat:@"%@ %@", first, last]];


        NSString *profilePath = [[self.closeByNeighbours objectAtIndex:indexPath.row] objectForKey:@"photo_path"];

        [cell.usermini sd_setImageWithURL:[NSURL URLWithString:profilePath]];


        return cell;            
     

    ...


【问题讨论】:

我试着回答了这个问题,但这是一个很大的代码块,如果没有运行它的其余上下文就不容易分析。你越能隔离和澄清你的问题,就越您可能会得到有用的回复(并自己回答问题)。 我对代码进行了格式化,这样代码块就不会被不必要地设计,并且事情会排成一行。但是,有一堆没有意义的位。代码的第一秒(在属性之后)不在函数中。然后再往下,有一个 dispatch_async 后面跟着一个没有附加到任何东西的失败块。 【参考方案1】:

self.finalDistancesCLGeocoder 上的完成处理程序运行之前不会设置。此外,每次通过完成处理程序中的for 循环,它都会重置为一个空的NSMutableArray

但是,也可能存在其他错误。

【讨论】:

试着把它缩小一点,哈哈!就是说...我删除了 NSMutableArray 重置行(没听懂,谢谢)。 self.finalDistances 仍然为空-也就是说,是因为这条线偶然吗? NSDictionary *distances = [self.finalDistances objectAtIndex:indexPath.row];我不确定 objectAtIndex 是否正确:/或者,我想也许我需要制作 NSMutableArray mutableCopy?至于在处理程序完成之前不会设置它,我认为最后运行 tableview reload 会纠正这个问题...... 代码真的很难读。它的格式非常糟糕。我将尝试对其进行格式化,以便您了解如何在以后的帖子中改进它。 我同意@DougRichardson,如果你输入“self.finalDistances = [NSMutableArray new];”在 for 循环中,每个循环都会“清理”数组。

以上是关于表视图中的 NSMutableArray 为空的主要内容,如果未能解决你的问题,请参考以下文章

表视图的 NSMutableArray 与 NSDictionary

如何使用 NSMutableArray 填充表视图

单击按钮时 NSMutablearray 到表视图

如何在 NSMutableArray 上添加观察者?

将 NSMutableArray 加载到 iPhone 的表视图中时无法识别的选择器

NSMutableArray 为表格视图填充太晚