2014-12-10 2 views
0

В настоящее время я пишу небольшое приложение iBeacon, и я хотел бы перечислить все маяки, поскольку они обнаружены, отсортированные по их близости, например. Немедленно, близко, далеко.iOS Objective C iBeacon Сортировка UITable View

По мере их обнаружения они добавляются в представление таблицы в зависимости от их статуса близости.

В представлении таблиц пользовательского интерфейса будут показаны основные и второстепенные, а ближайшие маяки будут сверху, а дальние маяки находятся внизу.

Я могу динамически добавлять маяки в таблицу без проблем, но у меня возникают проблемы с сортировкой данных, когда и когда обнаружены маяки.

Если у Array есть все маяки, я могу сортировать его без проблем с помощью дескриптора сортировки, проблема заключается в том, что маяк изменяется с дальнего расстояния до ближайшего или включается новый маяк, это всегда заканчивается на в нижней части таблицы.

Я предполагаю, что я должен, вероятно, использовать:

insertRowsAtIndexPaths: withRowAnimation

Но IO'm не уверен, как я хотел бы сделать это на минуту.

Любая помощь очень ценится.

Спасибо.

ответ

0

Вы должны каждый раз, когда маяк будет добавлен, чтобы отсортировать массив маяков видимый список, а затем вызовите [tableView reloadData]. Ниже приведен пример сортировки в методе, который предназначен для вызова в каждом обратном вызове диапазона.

- (void) updateIBeacons:(NSArray *)iBeaconsSeen { 
    _firstRangingUpdateReceived = YES; 
    NSDate * now = [NSDate date]; 
    __block BOOL resortNeeded = NO; 
    __block BOOL replaced = NO; 
    NSMutableArray *newSortedIBeacons = [[NSMutableArray alloc] initWithArray:[_sortedIBeacons copy]]; 
    [iBeaconsSeen enumerateObjectsUsingBlock:^(CLBeacon * iBeacon, NSUInteger idx, BOOL *stop) { 
     replaced = NO; 
     [_sortedIBeacons enumerateObjectsUsingBlock:^(CLBeacon * existingIBeacon, NSUInteger idx, BOOL *stop) { 
      if ([existingIBeacon.proximityUUID isEqual:iBeacon.proximityUUID] && 
       [existingIBeacon.major isEqual:iBeacon.major] && 
       [existingIBeacon.minor isEqual:iBeacon.minor]) { 
       [newSortedIBeacons setObject:iBeacon atIndexedSubscript:idx]; 
       replaced = YES; 
      } 
     }]; 
     [_iBeaconLastSeenTime setObject:now forKey: iBeacon]; 
     if (!replaced) { 
      resortNeeded = YES; 
      [newSortedIBeacons addObject: iBeacon]; 
     } 

    }]; 

    // now remove any iBeacons that have not been seen in the last 5 seconds 
    for (long i = newSortedIBeacons.count-1; i >= 0; i--) { 
     NSDate * lastSeen = (NSDate *) [_iBeaconLastSeenTime objectForKey:[newSortedIBeacons objectAtIndex:i]]; 
     if ([now timeIntervalSinceDate:lastSeen] > 5) { 
      [newSortedIBeacons removeObjectAtIndex:i]; 
      resortNeeded = YES; 
     } 
    } 

    if (resortNeeded) { 
     NSLog(@"We need to sort again"); 
     NSArray *sortedArray = [newSortedIBeacons sortedArrayUsingComparator:^(CLBeacon* obj1, CLBeacon* obj2) { 
      NSString *p1 = [NSString stringWithFormat:@"%@_%@_%@", [obj1.proximityUUID UUIDString], obj1.major, obj1.minor]; 
      NSString *p2 = [NSString stringWithFormat:@"%@_%@_%@", [obj2.proximityUUID UUIDString], obj2.major, obj2.minor]; 
      return [p1 compare:p2]; 
     }]; 
     _sortedIBeacons = [[NSMutableArray alloc] initWithArray:sortedArray]; 
    } 
    else { 
     _sortedIBeacons = newSortedIBeacons; 
    } 

    [self.tableView reloadData]; 

} 
0

В методе, который добавляет недавно обнаруженный маяк для источника данных в Tableview, вы можете сначала отсортировать массив радиомаяков, а затем сделать [tableView reloadData]

Смежные вопросы