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;
}
我有一个 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;
}