Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/94.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 在NSuserDefault中获取json结果,并在Swift中的MapKit中显示注释结果_Ios_Arrays_Json_Swift_Mapkit - Fatal编程技术网

Ios 在NSuserDefault中获取json结果,并在Swift中的MapKit中显示注释结果

Ios 在NSuserDefault中获取json结果,并在Swift中的MapKit中显示注释结果,ios,arrays,json,swift,mapkit,Ios,Arrays,Json,Swift,Mapkit,我想从json中获取结果,并将此结果保存在NSUserDefault中,然后使用保存在NSUserDefault中的json数组在MapKit上添加多个注释。 目前,为了获得json结果,我使用以下命令:(Swift 2.x) 为了在另一个视图中获得NSUserdefault,我尝试以下代码: let defaults = NSUserDefaults.standardUserDefaults() let test = NSUserDefaults.standardUserDefa

我想从json中获取结果,并将此结果保存在NSUserDefault中,然后使用保存在NSUserDefault中的json数组在MapKit上添加多个注释。 目前,为了获得json结果,我使用以下命令:(Swift 2.x)

为了在另一个视图中获得NSUserdefault,我尝试以下代码:

  let defaults = NSUserDefaults.standardUserDefaults()

    let test = NSUserDefaults.standardUserDefaults().objectForKey("annotation") as! NSArray
    map.addAnnotations(test as! [MKAnnotation])
    print("We saved this data: \(test)")
    //No print, error before
但是当我尝试这种方法时,我有一个错误

Could not cast value of type '__NSCFString' (0x1971a3958) to 'NSArray' (0x1971a4308).
如果实际返回的“tab”属性JSON为:

[伦敦,巴黎]

那么属性不是数组。您需要的是:

[‘伦敦’、‘巴黎’]


但另外,我可以告诉您,即使“tab”属性是一个格式正确的JSON数组,您的代码在尝试将其转换为[MKAnnotation]时也会失败。这是因为iOS的JSON库不知道如何将泛型NSArray转换为其类型等价物。指示JSON将转换为的所有类型。最佳情况下,“tab”属性是一个与MKAnnotation具有相同结构的项数组,并且正在转换为一个字典数组,您必须自己转换为MKAnnotation。但提供的JSON当前作为字符串进行计算。使用我建议的更改,它将计算为字符串数组-仍然不足以从中创建MKAnnotation。

将php代码更改为

$results = Array("tab" => ["london","paris"]);
而不是

$results = Array("tab" => "[london,paris]");
p、 如果使用早于5.5(或5.4不太记得)的php,则使用:

$results = Array("tab" => Array("london","paris"));
==========================

您正在将
setObject
func强制转换为
NSArray
,而不是测试对象

defaults.setObject(test, forKey: "annotation") as? NSArray
应该是

if let arrayTest = test as? NSArray{
     defaults.setObject(arrayTest, forKey: "annotation")
} 

JSON数据必须是有效的NSUserDefault类型之一(String、NSArray、NSDictionary、NSData)

最快的修复方法是将JSON存储在NSUserDefaults中,作为从服务器返回的NSData。然后在读取NSUserDefaults时反序列化NSData


如果确实需要从服务器存储JSON的子集,我会使用字典、数组并在存储数据之前验证数据。作为一般的Swift规则,我避免使用NSDictionary和NSArray来确保类型符合我的预期,并且不会导致运行时崩溃。

我猜json[“tab”]是一个字符串,而不是数组。我需要在php脚本中编辑代码。您能做
打印(测试)吗
并将其添加到您的问题中?我已经用结果编辑了我的问题。我担心这是一个字符串而不是NSArray,如果您的json无效,可能会发生这种情况。因为“[伦敦,巴黎]”;看起来不像printOk中的NSDIctionary成员,谢谢,但现在我有一个错误:
[8158:591496]-[\uu NSCFString坐标]:未识别的选择器发送到实例0x174223dc0 2015-12-01 20:39:46.229 blablabla[8158:591496]***由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[\uu NSCFString坐标]:当我尝试访问map view controller时,未识别的选择器发送到实例0x174223dc0'
,但Xcode说它在AppDelegate中,错误在哪里(从json获取数组的代码在哪里),谁说您可以将测试强制转换为[MKAnnotation]?True,因此我对MKAnnotation进行了注释,打印内容是:
我们保存了此数据:(伦敦、巴黎)
我明白了,但我不知道如何处理?我假设字符串数组应该表示批注的标题?在这种情况下,您将为数组中的每个字符串创建一个MKAnnotation实例,并将字符串指定为标题。我可以在同一数组中执行此操作吗?不确定您的意思。您缺少很多步骤。首先,您需要一个至少通过公开“坐标”属性来实际遵守MKAnnotation协议的类。然后,您必须使用存储在NSUserDefaults中的信息数组来创建MKAnnotation类的实例,然后将它们分配给MapView。
if let arrayTest = test as? NSArray{
     defaults.setObject(arrayTest, forKey: "annotation")
}