如何在IOS中为图像和字符串制作单独的数组?



我正在研究Web_API。我得到了图像和字符串形式的响应。

现在我想为每个图像和字符串创建一个数组。

这是我的回应:

JsonData={"Menu": [{"GroupMenu":"Student Info","Submenus":[{"title":"User Profile","icon":"http://192.168.0.129:85/Images/NavigationIcon/student_info.png","URL":"StudentProfile"},{"title":"View Attendence","icon":"http://192.168.0.129:85/Images/NavigationIcon/view_attendance.png","URL":"NA"},{"title":"Calender","icon":"http://192.168.0.129:85/Images/NavigationIcon/calender.png","URL":"NA"},{"title":"View TimeTable","icon":"http://192.168.0.129:85/Images/NavigationIcon/timetable.png","URL":"NA"}]},{"GroupMenu":"Transportation","Submenus":[{"title":"Map View","icon":"http://192.168.0.129:85/Images/NavigationIcon/map_view.png","URL":"GoogleMapActivity"},{"title":"Alerts & Notification","icon":"http://192.168.0.129:85/Images/NavigationIcon/alerts&notification.png","URL":"NA"},{"title":"Transportation Desk","icon":"http://192.168.0.129:85/Images/NavigationIcon/transportation_desk.png","URL":"NA"}]},{"GroupMenu":"Notification/Alerts","Submenus":[{"title":"Notification","icon":"http://192.168.0.129:85/Images/NavigationIcon/notification.png","URL":"NA"},{"title":"Principal’s Desk","icon":"http://192.168.0.129:85/Images/NavigationIcon/principal_desk.png","URL":"NA"},{"title":"Digital Diary","icon":"http://192.168.0.129:85/Images/NavigationIcon/digital_diary.png","URL":"NA"},{"title":"Assignment","icon":"http://192.168.0.129:85/Images/NavigationIcon/assignment.png","URL":"NA"}]},{"GroupMenu":"Payment Info","Submenus":[{"title":"View Bill","icon":"http://192.168.0.129:85/Images/NavigationIcon/view_bill.png","URL":"NA"},{"title":"Pay Bill","icon":"http://192.168.0.129:85/Images/NavigationIcon/pay_bill.png","URL":"NA"},{"title":"Online Payment History","icon":"http://192.168.0.129:85/Images/NavigationIcon/onlinepayment_history.png","URL":"NA"}]},{"GroupMenu":"Change Password","Submenus":[{"title":"Change Password","icon":"http://192.168.0.129:85/Images/NavigationIcon/change_password.png","URL":"NA"}]},{"GroupMenu":"Delete User","Submenus":[{"title":"Delete User","icon":"http://192.168.0.129:85/Images/NavigationIcon/delete.png","URL":"NA"}]}]}

预期输出:

studinfo = [NSArray arrayWithObjects:@"Student Info",@"calender",@"Timetable",@"View Attendance",nil];
studimageList = @[[UIImage imageNamed:@"studentinfo.png"], [UIImage imageNamed:@"calendrpng.png"], [UIImage imageNamed:@"timetable.png"],[UIImage imageNamed:@"viewattendance.png"]];
transinfo=[NSArray arrayWithObjects:@"MapView",@"Alert & Notification",@"Transportation Desk",nil];
transimageList = @[[UIImage imageNamed:@"mapview.png"], [UIImage imageNamed:@"alertsnotification.png"], [UIImage imageNamed:@"transportationdesk.png"]];
notificationinfo=[NSArray arrayWithObjects:@"Notification",@"Principal's Desk",@"Digital Diary",@"Assignment",nil];
notificationimageList=@[[UIImage imageNamed:@"notification.png"], [UIImage imageNamed:@"principalsdesk.png"], [UIImage imageNamed:@"digitaldiary.png"],[UIImage imageNamed:@"assignment.png"]];
payinfo=[NSArray arrayWithObjects:@"View Bill",@"Pay Bill",@"Online Payment History",nil];
payimageList = @[[UIImage imageNamed:@"viewbill.png"],[UIImage imageNamed:@"paybill.png"],[UIImage imageNamed:@"onlinepaymenthistory.png"]];

changepassinfo=[NSArray arrayWithObjects:@"Change Password",nil];
changepassimageList = @[[UIImage imageNamed:@"changepassword.png"]];
deleteuserinfo=[NSArray arrayWithObjects:@"Delete User",nil];
deleteuserimageList = @[[UIImage imageNamed:@"delete.png"]];
// json can be NSDictionary *json
id json = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
// parsing data from main dict (JSON data)
NSDictionary *innerDict1 = [json valueForKey:@"Menu"];
// now parsing data from menu dict
NSDictionary *innerDict2 = [innerDict1 valueForKey:@"Submenus"];
// parsing node of Submenus dict, can pass any key inside legs
NSLog(@"values: %@", [innerDict2 valueForKey:@"title"]);
// getting values inside mutable array
groupmenu = [innerDict1 valueForKey:@"GroupMenu"];
submenu = [innerDict2 valueForKey:@"title"];
icon = [innerDict2 valueForKey:@"icon"];
url = [innerDict2 valueForKey:@"URL"];
for(int i=0;i<groupmenu.count;i++)
{
switch(i)
{
case 0:
studinfo=submenu[i];
studimage=icon[i];
NSLog(@"studinfo= %@",studinfo);
NSLog(@"studimage %@",studimage);
break;
case 1:
transinfo=submenu[i];
transimage=icon[i];
NSLog(@"transinfo= %@",transinfo);
NSLog(@"transimage %@",transimage);
break;
case 2:
notificationinfo=submenu[i];
notificationimage=icon[i];
NSLog(@"notificationinfo= %@",notificationinfo);
NSLog(@"notificationimage= %@",notificationimage);
break;
case 3:
paymentinfo=submenu[i];
paymentimage =icon[i];
NSLog(@"paymentinfo= %@",paymentinfo);
NSLog(@" paymentimage = %@",paymentimage );
break;
case 4:
changepass=submenu[i];
changepassimage=icon[i];
NSLog(@"changepass= %@",changepass);
NSLog(@"changepassimage= %@",changepassimage);
break;
case 5:
delete=submenu[i];
deleteimage= icon[i];
NSLog(@"deleteimage= %@",deleteimage);
break;
}
}

JsonData 是一个字典。因此,您需要从中获取密钥,这是一个包含不同字典集的数组。循环访问不同的键以设置列表。

这应该可以帮助您入门:

for(int i = 0; i < ((NSArray*)[jsonData valueForKey:@"Menu"]).count; i++){
NSArray *subMenu = [[(NSArray*)[jsonData valueForKey:@"Menu"] objectAtIndex:i] valueForKey:@"Submenus"];
for(int k = 0; k < subMenu.count; k++){
[studimageList addObject:([[[[(NSArray*)[jsonData valueForKey:@"Menu"] objectAtIndex:i] valueForKey:@"Submenus"] objectAtIndex:k] valueForKey:@"icon"])];
}
[transinfo addObject:([[(NSArray*)[jsonData valueForKey:@"Menu"] objectAtIndex:i] valueForKey:@"GroupMenu"])];
.
.
.
}

如果JSONData是一个字符串,那么你需要创建一个NSData*对象来反序列化为NSDictionary*
我这样做的方法是创建一个自定义对象,该对象派生自初始化器将 JSONData 作为参数的NSObject*
让对象具有公共只读参数,初始化在其中设置它们。假设它是一个 NSDictionary...

-(instancetype)initWithJsonData:(NSDictionary*)jsonData{
if(self=[super init]){
_subMenu = jsonData[@"Menu"];
_menuImage = //load image from URL async
}
return self;
}

忽略这个sudo代码的粗糙,但希望你明白了。然后,您将能够在表或其他任何地方正确轻松地处理此对象,然后您就可以在那里

CustomObject * object = [[CustomObject alloc]initWithJsonData:jsonData];  
title = object.menuTitle; 

当然,如果您要异步下载图像(您应该这样做),请确保立即尝试调用object.image,否则它仍然会nil.
对于一两个项目来说,这可能是矫枉过正,但它节省了很多在控制器之间传递对象的麻烦。
我假设您正在处理 API,因为 IP 地址是本地的。我建议对于 URL,您要么提供绝对地址,要么设置一个基本 URL,然后传递相对地址以从中检索数据。此外,如果某些内容是"NA"(我假设是不适用的),则您将字段为 nil 或 null,而不是放入"NA"字符串,您必须手动解析该字符串。
希望这有帮助。

最新更新