iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

时间:2023-03-08 23:15:58
iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

一、初次读取json数据

iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

二、KVC转模型技巧,这里的技巧主要解决的是字典中的key 与 模型中有的属性对应不起来的时候 的解决办法

iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签    iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

  <方法1>

iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

<方法2>运行时字典转模型,运行时自己一直很晕。不过还是整理下来,方便以后用。 这里直接创建了一个分类。

  • 头文件代码
     //
    // NSObject+Model.h
    // Chaos_G
    // #import <Foundation/Foundation.h> @interface NSObject (Model) // 快速进行字典转模型
    // mapDict:模型中的哪个属性名跟字典里面的key对应
    + (instancetype)objcWithDict:(NSDictionary *)dict mapDict:(NSDictionary *)mapDict; @end
  • .m文件代码
     //
    // NSObject+Model.m
    // Chaos_G
    // #import "NSObject+Model.h" #import <objc/runtime.h> @implementation NSObject (Model) + (instancetype)objcWithDict:(NSDictionary *)dict mapDict:(NSDictionary *)mapDict
    {
    id objc = [[self alloc] init]; // 遍历模型中属性
    unsigned int count = ;
    Ivar *ivars = class_copyIvarList(self, &count); for (int i = ; i < count; i++) {
    Ivar ivar = ivars[i]; // 属性名称
    NSString *ivarName = @(ivar_getName(ivar)); ivarName = [ivarName substringFromIndex:]; id value = dict[ivarName];
    // 需要由外界通知内部,模型中属性名对应字典里面的哪个key
    // ID -> id
    if (value == nil) {
    if (mapDict) {
    NSString *keyName = mapDict[ivarName]; value = dict[keyName];
    }
    } [objc setValue:value forKeyPath:ivarName]; } return objc;
    } @end

三、利用UIWebView显示网页,显示网页过程中通过路径加载网页的URL时,路径中包含汉字的处理方法

  <方法1>

iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

  <方法2>

iOS彩票项目--第七天,初次读取json数据、KVC转模型技巧、运行时字典转模型以及初步对显示网页的操作并且跟踪标签

  • UIWebView显示网页的具体代码如下
 #import "ChaosHtmlViewController.h"
#import "ChaosHtml.h" @interface ChaosHtmlViewController () <UIWebViewDelegate> @end @implementation ChaosHtmlViewController - (void)viewDidLoad {
[super viewDidLoad]; self.navigationItem.title = _htmlItem.title; self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"取消" style:UIBarButtonItemStyleBordered target:self action:@selector(dismiss)]; // 取出webView 加载数据
UIWebView *web = (UIWebView *)self.view; web.delegate = self; // 设置web的代理,实现在web加载完成后,跳转到相应的网页标签 // 直接通过URLForResource:这个方法 获取的url就是将汉字处理过的URL
NSURL *url = [[NSBundle mainBundle] URLForResource:_htmlItem.html withExtension:nil]; NSURLRequest *request = [NSURLRequest requestWithURL:url]; // web 加载请求,一步一步往上走,缺什么补什么
[web loadRequest:request];
} - (void)dismiss
{
[self dismissViewControllerAnimated:YES completion:nil];
} // 在加载view的方法里面,将控制器的view改成UIWebView
- (void)loadView
{
UIWebView *web = [[UIWebView alloc] initWithFrame:ChaosScreenBounds]; self.view = web;
}
#pragma mark - webView的代理方法
// 执行JavaScript 必须在web加载完成的时候执行
- (void)webViewDidFinishLoad:(UIWebView *)webView
{ NSString *javaStr = [NSString stringWithFormat:@"window.location.href = '#%@';",_htmlItem.ID]; [webView stringByEvaluatingJavaScriptFromString:javaStr];
} @end