Objective C 中更新的词典 locationManager 方法在 Swift 中调用时打印 nil

Dictionary updated in Objective C locationManager method prints nil when called in Swift

我有一个 NSDictionary,当它在 Obj C 代码的范围内找到信标时,它会在 locationManager 中更新。当我在 Swift 中调用它并打印结果时,它给我“nil”。如果我在 locationManager 方法的末尾打印字典,它 returns 它找到的信标。 (桥文件也更新了所有 h 文件)我错过了吗?

Obj C 代码AIBMainTableViewController.m 文件:

- (void)locationManager:(CLLocationManager *)manager didRangeBeacons:(NSArray *)beacons inRegion:(CLBeaconRegion *)region
{
    NSLog(@"locationManager:%@ didRangeBeacons:%@ inRegion:%@",manager, beacons, region);

    NSMutableArray* listUuid=[[NSMutableArray alloc] init];
    NSMutableDictionary* beaconsDict=[[NSMutableDictionary alloc] init];
    for (CLBeacon* beacon in beacons) {
        NSLog(@"rssi is : %ld", beacon.rssi);
        NSString* uuid=[beacon.proximityUUID UUIDString];
        NSMutableArray* list=[beaconsDict objectForKey:uuid];
        if (list==nil){
            list=[[NSMutableArray alloc] init];
            [listUuid addObject:uuid];
            [beaconsDict setObject:list forKey:uuid];
        }
        [list addObject:beacon];
    }
    [listUuid sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
        NSString* string1=obj1;
        NSString* string2=obj2;
        return [string1 compare:string2];
    }];

    if (_sortByMajorMinor){
        for (NSString* uuid in listUuid){
            NSMutableArray* list=[beaconsDict objectForKey:uuid];
            [list sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {
                CLBeacon* b1=obj1;
                CLBeacon* b2=obj2;
                NSComparisonResult r=[b1.major compare:b2.major];
                if (r==NSOrderedSame){
                    r=[b1.minor compare:b2.minor];
                }
                return r;
            }];
        }
    }
    _listUUID=listUuid;
    _beaconsDict=beaconsDict;
    NSLog(@"The updated dictionary is: %@", _beaconsDict);
    [self.tableView reloadData];
}

Objective C AIBMainTableViewController.h 文件:

@interface AIBMainTableViewController : UITableViewController

@property(nonatomic, strong) NSDictionary*      beaconsDict;

@end

在 Swift 文件中,我这样做:

var viewContr = AIBMainTableViewController()

let beaconDict = viewContr.beaconsDict
print("The dictionary is: \(beaconDict))")

正如@Larme 在评论中提到的,我过早地调用了它。我在 AIBMainTableViewController.m 文件中添加了一个 (instancetype)init,现在它按预期工作了。

-(instancetype)init{
    self = [super init];
    if (self) {
        self.locationManager = [[CLLocationManager alloc] init];
        self.locationManager.delegate = self;

        self.listUUID=[[NSArray alloc] init];
        self.beaconsDict=[[NSMutableDictionary alloc] init];

        AIBBeaconRegionAny *beaconRegionAny = [[AIBBeaconRegionAny alloc] initWithIdentifier:@"Any"];
        [self.locationManager requestWhenInUseAuthorization];
        [self.locationManager startRangingBeaconsInRegion:beaconRegionAny];
        
    }
    return self;
}