Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法将坐标从带有mapKit的ViewController发送到另一个带有委派的ViewController_Ios_Swift_Xcode_Delegates_Mapkit - Fatal编程技术网

Ios 无法将坐标从带有mapKit的ViewController发送到另一个带有委派的ViewController

Ios 无法将坐标从带有mapKit的ViewController发送到另一个带有委派的ViewController,ios,swift,xcode,delegates,mapkit,Ios,Swift,Xcode,Delegates,Mapkit,我是Swift和iOS开发的新手。我有一个问题,我有三个视图控制器通过选项卡栏导航控制器连接。第一个viewController目前为空且未使用。在secondViewController中,我使用来自天气API的数据更新UI。在第三台电脑里我有一张地图。当我访问地图时,我需要坐标来更新secondViewController中的url 我试图实现的是在thirdViewController中检索当前纬度和经度(没问题),但是我无法通过委托发送这些值,以便触发secondViewControll

我是Swift和iOS开发的新手。我有一个问题,我有三个视图控制器通过选项卡栏导航控制器连接。第一个viewController目前为空且未使用。在secondViewController中,我使用来自天气API的数据更新UI。在第三台电脑里我有一张地图。当我访问地图时,我需要坐标来更新secondViewController中的url

我试图实现的是在thirdViewController中检索当前纬度和经度(没问题),但是我无法通过委托发送这些值,以便触发secondViewController中的函数,从而更新其中的变量。secondViewController中的委托函数不会被触发。我做错了什么?或者甚至有可能这样做

两个ViewController的代码如下所示:

secondViewController(这是我需要thirdViewController中映射值的地方)

thirdViewController(这是我尝试通过代理传递坐标值的地方)

我尝试了不同的方法,但似乎没有任何效果,secondViewController中的委托函数没有被触发。再说一次,我对这个很陌生,所以这可能是一件简单的事情。提前感谢您的帮助!此外,这里是我的故事板的截图,如果它可以帮助:


正如@Duncan C所说,你在做什么

var weatherManager = WeatherManager()
var mapViewController = ThirdViewController()
只需创建这些视图控制器的一个新实例——它们与您已有的视图控制器完全无关。当然,如果您执行
mapViewController.delegate=self
,则您正在设置
mapViewController
的委托。。。但是
mapViewController
不是您想要的视图控制器

要获取所需的视图控制器,可以访问选项卡栏控制器的视图控制器(当您在情节提要中创建它们时,会自动为您创建这些视图控制器),然后选择正确的视图控制器:

if 
    let viewControllers = self.tabBarController?.viewControllers, 
    viewControllers.count >= 3,
    let thirdViewController = viewControllers[2] as? ThirdViewController /// [2] because that's the third view controller in the array, which is the one you want
{
    thirdViewController.delegate = self
}

self.tabBarController
可能为零,因此需要将其展开。然后,您应该确保有3个以上的视图控制器。最后,您需要将所需的视图控制器(
self.tabBarController?.viewControllers[2]
)强制转换为
ThirdViewController
。然后,您可以将委托设置为该视图控制器。

请注意,如果选项卡栏控制器仅包含2项,则上述代码将崩溃。更安全的做法是将if语句分成多个部分,在这些部分中,它取消加载tabBarController并获取其viewControllers属性,验证它是否至少包含3项,然后提取第3项并尝试将其强制转换为
ThirdViewController
。假设tab bar控制器的设置是在编译时确定的,您可以认为让它崩溃并出现数组越界错误是可以的,因为您会立即意识到是否破坏了它。为安全起见,重写它时,if语句可能如下所示:
if let viewControllers=self.tabBarController?.viewControllers,viewControllers.count>=3,设thirdViewController=viewControllers[2]为?第三个视频控制器
var weatherManager = WeatherManager()
var mapViewController = ThirdViewController()
if 
    let viewControllers = self.tabBarController?.viewControllers, 
    viewControllers.count >= 3,
    let thirdViewController = viewControllers[2] as? ThirdViewController /// [2] because that's the third view controller in the array, which is the one you want
{
    thirdViewController.delegate = self
}