2016-10-26 2 views
2

Я работаю в 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) 

    } 



} 




} 
+0

Установить точку останова на 'переключателе (данных)' в 'userSentView (data:) ', чтобы проверить, вызывается метод. И кстати: вам не нужно проверять, является ли «делегирование» нулевым. Это выполняется оператором '?' В 'delegate? .userSentView (data: data)' – FelixSFD

+0

Я удалил «проверить, является ли делегат нулевым». И я попробовал точку останова и вызван метод. Когда я попробовал вариант 3 (рельеф), я получил следующее: dat = (string) «Terrain» self = (xxx.viewcontroller) 0x7b9b81d0 _0 (1tring) _1 (String) – hnegrao

ответ

0

Похоже, проблема в том, что Вы выдвигаете на совершенно новый (Home) ViewController, а не выкладывать стек в существующую.

Вы должны удалить эти строки:

let viewController = storyboard?.instantiateViewController(withIdentifier: "Home") 
self.navigationController?.pushViewController(viewController!, animated: true) 

И заменить эту строку:

dismiss(animated: true, completion: nil) 

с:

let _ = navigationController?.popViewController(animated: true) 
+0

Вот и все. Это работало Ганжо. Большое спасибо – hnegrao

+0

Добро пожаловать! Я вижу, что вы новичок в Stack Overflow. Если вы чувствуете, что ответ решил проблему, отметьте ее как «принятую», нажав зеленую галочку. Благодаря! – ganzogo

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