从模式呈现的视图控制器转换到标签栏控制器中的视图控制器

时间:2017-06-13 10:41:48

标签: swift3 uinavigationcontroller uitabbarcontroller uistoryboard

我一直在努力与以下人员争取一些帮助。

当' FINISH'在“添加位置”按钮上按下按钮场景和一些代码运行。代码完成后,其中一个标题为“在地图上”的场景。应该显示(无论你按哪个+)。

地图上的'标题场景嵌套在导航控制器和标签栏控制器中。

当您按下'查找位置'现场表演。按“找到位置”'然后'添加位置'现场表演。

我遇到的问题是如何从添加位置场景过渡到相应的“在地图上”#39;场景?

enter image description here

这是从地图或表格视图场景转换到“查找位置”的代码。场景。

    @IBAction func addLocation(_ sender: Any) {
//        if Constants.CurrentUser.objectId == "" {
//            displayFindLocationVC()
//        } else {
            let title = "Student has a location"
            let message = "\(Constants.LoggedInUser.firstName) \(Constants.LoggedInUser.lastName) has posted a student location. Would you like to overwrite the existing location?"
            let alert = UIAlertController(title: title, message: message, preferredStyle: .alert)
            alert.addAction(UIAlertAction(title: "Overwrite", style: .default   ) {
                action in
                self.displayFindLocationVC()
            })
            alert.addAction(UIAlertAction(title: "Cancel", style: .cancel))
            present(alert, animated: true, completion: (displayFindLocationVC))
        //}
    }

    func displayFindLocationVC() {
        let findLocationVC = storyboard?.instantiateViewController(withIdentifier: "FindLocation") as! FindLocationViewController
        present(findLocationVC, animated: true, completion: nil)
    }

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

不是直接显示Add Location视图控制器,而是将其嵌入到导航控制器中,您可以使用navigationController视图控制器中的Add Location属性进行访问。然后您可以关闭导航控制器以显示标签栏控制器。

// AddLocationViewController.swift

@IBAction func didTouchUpInsideFinishButton() {

    // ...

    navigationController?.dismiss(animated: true, completion: nil)
}

Storyboard screenshot

答案 1 :(得分:0)

Stefan,我建议使用代表,这样你就可以告诉他们找到位置'和'添加位置'场景在哪里报到。

首先在地图视图控制器类中定义一个协议,如下所示:

protocol OnTheMapDelegate {
    func didChooseLocation(location:CLLocation)
}

class OnTheMapViewController:UIViewController {
    override func viewDidLoad() {
        // etc...
    }
}

然后让您的OnTheMapViewController符合此协议:

class OnTheMapViewController:UIViewController, OnTheMapDelegate {
    override func viewDidLoad() {
        // etc...
    }
    func didChooseLocation(location:CLLocation) {
        // Do something with location object returned from other scenes here.
    }
}

您现在需要将其他场景作为参考提交给OnTheMapViewController,以便当用户选择新位置时我们可以将其传回。

FindLocationViewControllerAddLocationViewController类的顶部添加一个变量来存储此参考

class FindLocationViewController:UIViewController {
    var delegate:OnTheMapDelegate?
    override func viewDidLoad() {
        // etc...
    }
}

class AddLocationViewController:UIViewController {
    var delegate:OnTheMapDelegate?
    override func viewDidLoad() {
        // etc...
    }
}

接下来在AddLocationViewController场景中,一旦用户选择了新位置,请使用代理将其传回:

class AddLocationViewController:UIViewController {
    var delegate:OnTheMapDelegate?
    override func viewDidLoad() {
        // etc...
    }

    func userSavedNewLocation(loc:CLLocation) {
        if let del = self.delegate {
            del.didChooseLocation(location:loc)
        }
    }
}

剩下要做的就是确保在创建FindLocationViewControllerAddLocationViewController场景的新实例时正确设置委托变量。

使用您的代码,第一个示例在地图视图控制器中将如下所示:

func displayFindLocationVC() {
    let findLocationVC = storyboard?.instantiateViewController(withIdentifier: "FindLocation") as! FindLocationViewController
    findLocationVC.delegate = self
    present(findLocationVC, animated: true, completion: nil)
}

第二次你需要传递它时,当你初始化Add Location场景时,我假设它在Find Location场景中,所以它看起来像这样:

func displayAddLocationVC() {
    let addLocationVC = storyboard?.instantiateViewController(withIdentifier: "AddLocation") as! AddLocationViewController
    if let del = self.delegate {
        addLocationVC.delegate = del
    }
    present(addLocationVC, animated: true, completion: nil)
}

我在这里没有提到的唯一一件事就是你也想要解雇每个模态视图控制器以显示下面的OnTheMapViewController,为此,你只需要在每个班级的某个地方调用它,可能是你完成了那个vc:

self.dismiss(animated: true, completion: nil)

这是未经测试的代码,请告诉我你是如何进行的。