Я работаю в Xcode 8 - Swift. У меня есть 2 просмотрщика: MAin Screen (первый) и View Options (Second ViewController). На главном экране у меня есть карта с моим местоположением. На этом экране у меня есть кнопка, чтобы пользователь мог перейти на экран «Просмотры» и выбрать, какой тип карты он хочет (это делается с помощью segue). Пользователь может выбрать один из трех вариантов: Обычный, Спутник и Территория. Я реализовал второй контроллер просмотра с табличным представлением кнопок. Что бы я ни выбрал, он отправляет меня на главный экран (контроллер первого вида). У меня нет другого segue, чтобы отправить меня в контроллер первого взгляда, я внедрил навигационный контроллер с задним buckon.Swift 3 - Изменение карты Тип от контроллера вида до другого
Протестировано до сих пор. Все работает нормально: карты и другие вещи.
Я создал протокол/делегат, чтобы, когда я выбираю, какую карту я хочу видеть в первом контроллере представления, он отправляет мне информацию в первую очередь. Я попытался отправить строку с первого контроллера представления на второй, и мне удалось это сделать. Дело в том, что я не могу изменить тип карты ... Я не знаю, почему, но это показывает мне стандартную карту ...
Может ли кто-нибудь мне помочь?
Вот пример кода. Главный экран Первый View Controller:
class ViewController: UIViewController, CLLocationManagerDelegate, MKMapViewDelegate, DataSentDelegate {
var locationManager = CLLocationManager()
@IBOutlet var map: MKMapView!
override func viewDidLoad() {
super.viewDidLoad()
self.locationManager.delegate = self
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest
self.locationManager.requestWhenInUseAuthorization()
self.locationManager.startUpdatingLocation()
self.map.showsUserLocation = true
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
let userLocation: CLLocation = locations[0]
let latitude = userLocation.coordinate.latitude
let longitude = userLocation.coordinate.longitude
let latDelta: CLLocationDegrees = 0.05
let longDelta: CLLocationDegrees = 0.05
let span = MKCoordinateSpanMake(latDelta, longDelta)
let location = CLLocationCoordinate2DMake(latitude, longitude)
let region = MKCoordinateRegionMake(location, span)
self.map.setRegion(region, animated: true)
self.locationManager.stopUpdatingLocation()
}
//Protocol
func userSentView(data: String) {
switch (data) {
case "Satellite":
self.map.mapType = .satellite
break
case "Terrain":
self.map.mapType = .hybrid
break
default:
self.map.mapType = .standard
break
}
}
//Protocol
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "SegueView" {
let TVCView: TVCView = segue.destination as! TVCView
TVCView.delegate = self
}
}
}
Во втором ViewController у меня есть это:
protocol DataSentDelegate {
func userSentView(data: String)
}
class TVCView: UITableViewController {
var ViewNames = [String]()
var identities = [String]()
//***
var delegate: DataSentDelegate? = nil
override func viewDidLoad() {
super.viewDidLoad()
self.title = "View"
//globalView = 1;
ViewNames = ["Normal","Satellite","Terrain"]
identities = ["Normal","Satellite","Terrain"]
self.tableView.tableFooterView = UIView()
}
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return ViewNames.count
}
//Add names to cells
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "CellView", for: indexPath)
cell.textLabel?.text = ViewNames[indexPath.row]
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let viewController = storyboard?.instantiateViewController(withIdentifier: "Home")
self.navigationController?.pushViewController(viewController!, animated: true)
//To know which view was selected
let vcName = identities[indexPath.row]
//***
if delegate != nil {
let data = vcName
delegate?.userSentView(data: data)
dismiss(animated: true, completion: nil)
}
}
}
Установить точку останова на 'переключателе (данных)' в 'userSentView (data:) ', чтобы проверить, вызывается метод. И кстати: вам не нужно проверять, является ли «делегирование» нулевым. Это выполняется оператором '?' В 'delegate? .userSentView (data: data)' – FelixSFD
Я удалил «проверить, является ли делегат нулевым». И я попробовал точку останова и вызван метод. Когда я попробовал вариант 3 (рельеф), я получил следующее: dat = (string) «Terrain» self = (xxx.viewcontroller) 0x7b9b81d0 _0 (1tring) _1 (String) – hnegrao