iOS开发技巧

早期笔记——2016

2020-07-21  本文已影响0人  夏天的枫_

一、我是 Cell自适应高度 传送门
二、我是 Cocoapods 安装
三、iOS本地数据存取----偏好设置、归档、数据库

一、发送选择器错误 1、[__NSCFDictionary away_name]: unrecognized selector sent to instance 0x7fe098d22050 Debug:字典和away_name类型不一样,字典不能调用away_name的方法,从而导致bug,应该从两者的类型改正
2.调用方法失败 [__NSCFString objectForKeyedSubscript:]: unrecognized selector sent to instance 0x7c9baaf0'

Debug:String和字典的类型不匹配,表示获取失败。

2.类型错误

这个出现在遍历数组时,发生的类型错误。

二、Xcode7 特性。 1.关于HTTP->HTTPS App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file. Debug****:****
在****info.plist****最后加入


<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>

三、数据解析
JSON类 1、如果解析出来的response数据结构是数组,则直接用数组接收;

 [Http_Toolget:CPU_Urlparameters:nilsuccess:^(idresponse) {

   NSArray* array = [NSJSONSerializationJSONObjectWithData:responseoptions:NSJSONReadingAllowFragmentserror:nil];

       JSONModelArray* modelArray = [[JSONModelArrayalloc]initWithArray:arraymodelClass:[DetailModelclass]];

       for(DetailModel* modelinmodelArray) {

            [self.dataSourceaddObject:model];
        }
        [self.tableViewreloadData];
       NSLog(@"%@",self.dataSource);
    }failure:^(NSError* error) {
       NSLog(@"%@",error);

    }];   

2、如果解析出来的response数据结构是字典,则直接用字典接收;
如果字典中带有其他的数组或字典,则直接通过键值查找到自己需要的字典外层;

 NSError* error =nil;
 NSDictionary* responseDict = [NSJSONSerializationJSONObjectWithData:responseoptions:NSJSONReadingAllowFragmentserror:&error];

        NSArray* applicaitonsArray = responseDict[@"applications"];

       JSONModelArray* array = [[JSONModelArrayalloc]initWithArray:applicaitonsArraymodelClass:[LimitFreeModelclass]];

       for(LimitFreeModel* modelinarray) {

            [self.dataSourceaddObject:model];
        }
        [self.tableViewreloadData];
        [self.headViewendRefreshing];

        [self.footViewendRefreshing];

//字典里套字典,则直接用dict去多层,知道你想要的那层数据结构,比如dict[@“des”][@“result”],如果是数组,则建数组接,        

法二、

[Http_Toolget:nearby_urlparameters:paramsisIgnoreCache:YESsuccess:^(idresponse) {
       NSDictionary* dict = [NSJSONSerializationJSONObjectWithData:responseoptions:0error:nil];

       NSArray* apps = [LimitFreeModelarrayOfModelsFromDictionaries:dict[@"applications"]];

        [self.nearbyAppsArrayaddObjectsFromArray:apps];//apps里的每个元素作为self.nearbyAppsArray的一个个数组元素 [selfupdateNearbyUI];

    }failure:^(NSError* error) {

    }];

3.如果着实查不出或取不到想要的那层数据,则直接采取字典取值的方法,不再使用Model类。

//        NSLog(@"%@",response); NSDictionary * dic = response[@"result"];
        NSArray * arr = dic[@"games"];
       for(inti=0; i< arr.count; i ++) {
            NSDictionary * dataarray = arr[i];

            NSArray * arraydata = dataarray[@"data"];

            JSONModelArray * array = [[JSONModelArray alloc] initWithArray:arraydata modelClass:[AppModel class]];

           for(AppModel * modelinarray) {

 [self.dataSource addObject:model];

            } 

        }

//一级数组里套一级字典,字典里面套二级数组,数组里的是二级字典,1.用字典遍历一级数组取得每个一级字典,建二级数组接每个一级字典的值,每个二级数组得到的就是一个一个的字典,所以就用字典去遍历这个二级数组,二级字典里的键值对就是要得到的数据。

XML类 1.层层获取,一层一层刨;这是使用GData第三方框架 // NSString * str = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];这个可以直接查看到数据的结构以及XML格式下的名字等 // NSLog(@"%@",str);

if(self.currentPage==1) {
            [self.dBaseArrayremoveAllObjects];
            [self.dataSourceremoveAllObjects];
            [selfdeleteCache];
        }
       GDataXMLDocument* doc = [[GDataXMLDocumentalloc]initWithData:responseoptions:NSUTF8StringEncodingerror:nil];
       GDataXMLElement* rootElement = [docrootElement];
       NSArray* resourceEleArray = [rootElementelementsForName:@"resource"];
for(GDataXMLElement* elementinresourceEleArray) {
           //获取子结点 Model* model = [[Modelalloc]init];
            model.name= [[elementelementsForName:@"name"][0]stringValue];
            model.introduce= [[elementelementsForName:@"introduce"][0]stringValue];
            model.url= [[elementelementsForName:@"url"][0]stringValue];
            [self.dataSourceaddObject:model];
            [self.dBaseArrayaddObject:model];
        }
        [self.tableViewreloadData];

四、TableView的BUG处理

** 1.[UISectionRowData refreshWithSection:tableView:tableViewRowData:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit_Sim/UIKit-3505.16/UITableViewRowData.m:540** Debug:dataSource的问题导致了返回的数组值出现错误。应检查数组的添加

五、 当想要改变界面指向,而且界面时storyboard时,这样写有错

idmainVc = [UIStoryboardstoryboardWithName:@"Main"bundle:nil];

***** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIStoryboard _preferredInterfaceOrientationGivenCurrentOrientation:]: unrecognized selector sent to instance 0x7fbf435d15e0'**

正解: idmainVc = [[UIStoryboardstoryboardWithName:@"Main"bundle:nil]instantiateInitialViewController]

贰、零碎知识

1.动画整理 SortViewController* svc = [[SortViewControlleralloc]init];

   //给试图控制器切换的时候,添加动画 CATransition* animation = [CATransitionanimation];

        animation.type=@"reveal";
        animation.subtype=@"fromLeft";
        animation.duration=1.0;
    [self.view.superview.layeraddAnimation:animationforKey:nil];
 [self.navigationControllerpushViewController:svcanimated:YES]; 

2.给视图添加手势,可记录点击的标记

         iconImageView.userInteractionEnabled=YES;
         iconImageView.layer.cornerRadius=5.0;
         iconImageView.tag=10+ index;//添加tag作为标记 iconImageView.layer.masksToBounds=YES;

          UITapGestureRecognizer* tap = [[UITapGestureRecognizeralloc]initWithTarget:selfaction:@selector(nearbyAppClick:)];
           [iconImageViewaddGestureRecognizer: tap];
           [self.nearbyScrollViewaddSubview:iconImageView];
//取出点击到的App的model LimitFreeModel* model1 =self.nearbyAppsArray[tap.view.tag-10];
self.model= model1; 

3.//设置标题UINavigationBar的样式

[[UINavigationBarappearance]setTitleTextAttributes:@{NSForegroundColorAttributeName:[UIColorwhiteColor]}];//设置白色字体
 [UINavigationBarappearance]setBackgroundImage:[[UIImageimageNamed:@"NavigationBarShadow"]stretchableImageWithLeftCapWidth:0.5topCapHeight:0.5]forBarMetrics:UIBarMetricsDefault]; // 设置背景图片

4.添加.pch文件

.pch文件是全局共享的头文件,对于经常使用的对象、宏定义等可以声明在pch文件中。在Build Setting中搜索.pch文件名字,添加路径如“工程名/XXX.pch”

还有个路径就是 "${SRCROOT}工程名/XXX.pch"

5.价格划线

[cell.pastPriceLabelsetAttributedText:[self attibutedStringWithString:[NSStringstringWithFormat:@"¥%@", model.price]]];——>调用方法
 
- (NSAttributedString*)attibutedStringWithString:(NSString*)string
{
   NSMutableAttributedString* attributeString = [[NSMutableAttributedStringalloc]initWithString:stringattributes:@{NSStrikethroughStyleAttributeName:[NSNumbernumberWithInteger:NSUnderlineStyleSingle]}]; 
//,NSStrikethroughColorAttributeName:[UIColor purpleColor] 设置颜色 returnattributeString;
}

6.给工程适配多语言

1⃣️ 首先在工程文件的info选项下找到localization,添加语言。

2⃣️ 在工程中新建文件:resource —>String File ,改名为InfoPlist,把系统info.plist 源文件中的“CFBundleName”,复制到相应语言文件中如中文文件:CFBundleName ="徒步旅行”;,英文下:CFBundleName ="OnFootTravel”;。改变模拟器的语言状态既可显示相应的App名字。注意无 “@”

7、telnet (IP地址) 端口(80) 可查看服务器是否开启。

image.png

8,计算固定大小的字符串尺寸

// 获取固定大小下字符串的尺寸 CGSizetextMaxSize =CGSizeMake(150,MAXFLOAT);
NSDictionary*attrs =@{NSFontAttributeName: [UIFontsystemFontOfSize:14.0]};

CGSizetextSize = [_iMessageboundingRectWithSize:textMaxSizeoptions:NSStringDrawingUsesLineFragmentOriginattributes:attrscontext:nil].size;

9.让App在后台一直运行

【链接】iOS开发:保持程序在后台长时间运行

http://www.cnblogs.com/wskgjmhh/p/5235947.html【链接】iOS让你的app一直在后台活着(运行)

http://blog.csdn.net/ios_dashen/article/details/50352204http://jingyan.baidu.com/article/d8072ac47d3c00ec94cefd5b.html

上一篇下一篇

猜你喜欢

热点阅读