Ios 无法将坐标从带有mapKit的ViewController发送到另一个带有委派的ViewController
我是Swift和iOS开发的新手。我有一个问题,我有三个视图控制器通过选项卡栏导航控制器连接。第一个viewController目前为空且未使用。在secondViewController中,我使用来自天气API的数据更新UI。在第三台电脑里我有一张地图。当我访问地图时,我需要坐标来更新secondViewController中的url 我试图实现的是在thirdViewController中检索当前纬度和经度(没问题),但是我无法通过委托发送这些值,以便触发secondViewController中的函数,从而更新其中的变量。secondViewController中的委托函数不会被触发。我做错了什么?或者甚至有可能这样做 两个ViewController的代码如下所示: secondViewController(这是我需要thirdViewController中映射值的地方) thirdViewController(这是我尝试通过代理传递坐标值的地方) 我尝试了不同的方法,但似乎没有任何效果,secondViewController中的委托函数没有被触发。再说一次,我对这个很陌生,所以这可能是一件简单的事情。提前感谢您的帮助!此外,这里是我的故事板的截图,如果它可以帮助:Ios 无法将坐标从带有mapKit的ViewController发送到另一个带有委派的ViewController,ios,swift,xcode,delegates,mapkit,Ios,Swift,Xcode,Delegates,Mapkit,我是Swift和iOS开发的新手。我有一个问题,我有三个视图控制器通过选项卡栏导航控制器连接。第一个viewController目前为空且未使用。在secondViewController中,我使用来自天气API的数据更新UI。在第三台电脑里我有一张地图。当我访问地图时,我需要坐标来更新secondViewController中的url 我试图实现的是在thirdViewController中检索当前纬度和经度(没问题),但是我无法通过委托发送这些值,以便触发secondViewControll
正如@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
}