2016-12-14 5 views
0

Я хочу, чтобы отсортировать мое TableView на расстоянии, но я перепутал :(Пожалуйста, помогите мне, если Вы можете, я был бы признателен, действительно :(distanceInMeters Проблемы с массивами и сортируют

У меня есть массив с 100 объекты.

var malls: [Mall] = [ 

    Mall(name: "Европейский", type: "торговый центр", image: "europe.jpg", time: "с 10.00 до 22.00", 
     timeWeek: "с 10.00 до 23.00", city: "Москва", location: "Киевская", 
     adress: "г. Москва, Киевского вокзала площадь, д.2", cinemaName:"formulakino.png", 
     productName: "perekrestok.png", numShop: "309", website: "http://europe-tc.ru", schemeWeb:"http://www.europe-tc.ru/shops/", longitude:37.566, latitude:55.745), 

    Mall(name: "Золотой Вавилон Ростокино", type: "торговый центр", image: "vavilon.jpg", time: "с 10.00 до 22.00", 
     timeWeek: "с 10.00 до 22.00", city: "Москва", location: "Проспект Мира", 
     adress: "г. Москва, Проспект Мира, д. 211", cinemaName: "Люксор", 
     productName: "okay.png", numShop: "280", website: "http://zolotoy-vavilon.ru/rostokino", schemeWeb:"http://www.zolotoy-vavilon.ru/rostokino/map", longitude:37.663, latitude:55.846), ] 

и так далее .. извините за кириллицы

и после коррекции Func Tableview у меня есть эта

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) 
{ 


    let currentLocation = locations[0] 


    if (currentLocation.horizontalAccuracy > 0) { 
     locationManager.stopUpdatingLocation() 
     let coords = CLLocation(latitude: currentLocation.coordinate.latitude, longitude: currentLocation.coordinate.longitude) 
     **let mallLocate = CLLocation(latitude: mall.latitude, longitude: mall.longitude)** 
     let distanceInMeters = mallLocate.distance(from: coords) 
     print (distanceInMeters) 
    } 

} 
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! EateriesTableViewCell 
    let mall = mallToDisplayAt(indexPath: indexPath) 
    cell.thumbnailImageView.image = UIImage(named: mall.image) 
    cell.thumbnailImageView.clipsToBounds = true 
    cell.nameLabel.text = mall.name 
    cell.locationLabel.text = mall.location 
    cell.typeLabel.text = mall.time 


    return cell 

} 

У меня есть проблема в этом ряду

let mallLocate = CLLocation(latitude: mall.latitude, longitude: mall.longitude) 

Использование неразрешенного идентификатора «торговый центр»

Как я могу это исправить? и как делать сортировку по направлениям? Огромное спасибо.

ответ

0

Использование неразрешенного идентификатора 'торговый центр'

=> Там нет ничего по имени "торговый центр" в рамках от функции locationManager didUpdateLocations. Значение: locationManager didUpdateLocations не имеет понятия, что происходит внутри tableView cellForRowAt indexPath и наоборот.


Вы могли бы решить эту проблему, применяя следующие шаги к коду:

  1. Переместить расчет расстояния от
    locationManager didUpdateLocations
    в
    tableView cellForRowAt indexPath
  2. добавить свойство к классу который сохраняет текущее положение:
    var currentPosition: CLLocation? = nil

  3. магазин позиция появляется в locationManager didUpdateLocations к currentPosition собственности

  4. Добавить self.tableView.reloadData() после того как вы получили и назначены позиции
  5. Используйте mall и currentPosition в cellForRowAt для вычисления расстояния и обновления distanceLabel
  6. Имейте ввиду, что currentPosition может быть nil. Расстояние не может быть выбрано => сделать метку пустой или добавить что-то вроде "unknown distance" to
+0

Большое вам спасибо! – dmarinkin

0

Вы должны выбрать индекс вашего массива:

let mallLocate = CLLocation(latitude: malls[0].latitude, longitude: malls[0].longitude) 
+0

wow! спасибо и как сделать cell.distanceLabel = distanceInMeters – dmarinkin

+0

О 'cell.distanceLabel = distanceInMeters' Я не то, что вы говорите о –

+0

пожалуйста, как переназначения Func Tableview (_ Tableview: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { cell.distanceLabel = distanceInMeters } distanceInMeters - неразрешенный идентификатор ( – dmarinkin

0

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

Я предлагаю вам добавить var distanceToUser в объект Mall.(Сделать это дополнительное двойной)

В locationManager.didUpdateLocations(), зацикливание через массив торговых центров и использовать функцию CLLocationdistance(from:) вычислить расстояние от нового местоположения пользователя в каждый торговый центр, и сохранять это значение в distanceToUser собственности каждого торгового центра.

Как только вы заполнили свойства вашего массива торговых центров distanceToUser, вы можете отсортировать массив по этому свойству. Наконец, вызовите метод reloadData() в виде таблицы. Напишите свой метод tableView(cellForRowAt:) для отображения ваших ячеек в существующем порядке массива.

Причиной включения свойства расстояния в объекты вашего торгового центра является производительность. Функция диспетчера местоположений для вычисления расстояния между двумя точками на самом деле занимает несколько времени (она должна выполнять 3D-триггер, чтобы получить точный расчет на поверхности земного шара.) Вы хотите избежать чрезмерного вычисления значения расстояния , Вместо этого, путем пакетного вычисления расстояния до вновь обновленного местоположения, сортировка может обрабатывать значения расстояния как известные константы, которые вычисляются один раз для объекта Mall при изменении местоположения.

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

Вы также хотите настроить диспетчер местоположений только для обновления текущего местоположения, когда оно изменяется на довольно большие суммы. Либо это, либо вставить код, который сравнивает новое местоположение со старым и только повторно сортирует массив торговых центров, если расстояние изменилось настолько, чтобы повлиять на порядок сортировки вашего массива Malls. (При наивысшей чувствительности менеджер местоположений дает вам почти постоянный поток крошечных изменений местоположения, что означает, что вы постоянно пересчитываете свои расстояния и повторно сортируете массив ваших автомобилей.)