iOS:开发杂记(二)--sdk

----webView中加载的地址格式:必须为加上http://的格式;

----NSTimer开启定时方法:recordTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(recordTiming:) userInfo:nil repeats:YES];
     若在方法recordTiming:(NSTimer *)timer里面用参数timer停止定时器,[timer invalidate]; timer = nil; 则在其他地方用到recordTimer 判断(外部终止定时器),[recordTimer invalidate]则程序会crash,解决办法:1.在timer参数停止完定时器之后加一句,recordTimer = nil;2.在recordTiming:(NSTimer *)timer方法里面用recordTimer去停止定时器。 

-----button的text不显示:UILabel的text默认是黑色的,UIButton的label中text默认是白色的,所有如果背景是白色的,可能会导致相关内容看不到。

-----label背景为白:ios8以后,UILabel默认背景色不在是透明的了,而是白色。

-----使用UItextField的时候,如果想让控制器响应textFieldShouldBeginEditing等方法,需要控制器实现UItextField的代理,给UItextField的delegate赋值等。

-----使用tableview的时候,想要分段显示,如果tableview的style时plain,设置heightForHeaderInSection,虽可以达到分段效果,但是section的header滑动的时候滑到头了就会停靠tableview上;要想达到正常的分段效果,使用group的style。注意俩个分段的间距 = 上个header + 下个footer高度。默认是10pt,如果第一个想顶格,heightForHeaderInSection返回0.1即可。

-----关于NSRange成员的说明:表示范围(location,length),其中loc表示从哪个位置开始(包含该位置),位置的开始位置从0开始,len表示个数。例如,[@"012345679" substringWithRange:NSMakeRange(1, 2)] 表示“12”。

-----关于 substringToIndex + substringFromIndex 方法参数的说明:例如,toIndex:3 表示从开始到位置3之间(不包括3),FromIndex:3表示从位置3(包括3)开始。位置几的计算都是从0开始算。

-----关于方法textField:shouldChangeCharactersInRange:replacementString说明:例如做一个手机格式139 8888 8888格式输入优化: 

     if (textField == self.displayTel) {
        
        if (0 < [string length]) { // 添加字符串
            //  139 1122 3344 格式
            if (3 == [self.displayTel.text length]) {
                self.displayTel.text = [self.displayTel.text stringByAppendingString:@" "];
                return YES;
            }else if (8 == [self.displayTel.text length]){
                self.displayTel.text = [self.displayTel.text stringByAppendingString:@" "];
                return YES;
            }else if (13 == [self.displayTel.text length]){
                return NO;
            }
        }else if(0 == [string length]){ // 删除字符串
            //  139 1122 3344 格式 0,3  4,4
            if (5 == [self.displayTel.text length]) {
                self.displayTel.text = [self.displayTel.text substringToIndex:4]; // return yes 还会删除一个字符,下同
                return YES;
            }else if (10 == [self.displayTel.text length]){
                self.displayTel.text = [self.displayTel.text substringToIndex:9];
                return YES;
            }            
        }
    }
    return YES;
         总结:1.replacementString(上面string)表示当前修改的字符串,可以有一定内容(新增字符操作),也可能是空串(删除字符操作);

                    2.range:表示当前发生改变的位置,如果在n位置处新增一个字符串是(n,0),在n位置处删除一个字符串是(n,1),n也是从0开始,表示后者对比前者改变的range,所以新增长度是0(新增串替换原来位置,原来位置空,所以长度0),删除长度是1(空串替换了长度为1的字符串)

                    3.注意方法的返回值,return YES,会允许该改变,所以上面例子substringToIndex参数是4,因为之后还会删除一个字符串

-----[tableview cellForRowAtIndexPath:indexPath]方法,有时为了获取cell上面的一些子视图(textfield),来赋值、弹下键盘等,用来它获取tableview的特定cell。但该方法有隐患,如果indexpath不在屏幕显示区域,方法返回nil,所以用的时候,要做好它为nil的准备。从indexPathsForVisibleRows方法也可以看出来,并不是所有的indexPaths都有用

-----label的attributedText和text属性是“共存”的,不要以为是相互独立的。如果将text属性置为nil,attributedText也显示不出来;

-----关于UIButton中setTitle:forState 和btn.titleLabel.text的区别:(1)前者是Sets the title to use for the specified state.为不同btn的state,赋予字符串;(2)后者是A view that displays the value of the currentTitle property for a button. (read-only),即展示currentTitle的label。

       注意currentTitle的说明:The current title that is displayed on the button.The value for this property is set automatically whenever the button state changes.因为button有不同状态,所以currentTitle值可能在不同状态下不同。

       所以,前者是为btn不同状态下的显示字符串赋值。而后者是显示不同状态下title用的label。所以为btn赋予字符显示必须用前者,测试发现后者不好使。同理

// 这些可以
button.titleLabel.font            = [UIFont systemFontOfSize: 12];
button.titleLabel.lineBreakMode   = NSLineBreakByTruncatingTail;
// text color or shadow color 必须用 setTitleColor:forState: and setTitleShadowColor:forState: 

-------遍历+删除:报错NSGenericException was mutated while being enumerated。但你在遍历一个数组的时候,不能在里面同时做删除操作!

         解决办法:1.换成2个数组操作,一个用于遍历,一个实际删除;  2.拆成俩个过程,新找出来,之后再删除。

NSArray *tempArray = [yourArray copy];

for(id obj in tempArray) {
    //It's safe to remove objects from yourArray here.
}
[tempArray release];
 NSMutableArray *toDestroy = [NSMutableArray arrayWithCapacity:_contactor.count];
    for(Man *sprite in self.contactor)
    {
        if (sprite.hp<=0 && sprite.stat == stat_attack)
        {
            [sprite stopAllActions];
            [sprite animDead];
            [toDestroy addObject:sprite];
        }
    }
    [self.contactor removeObjectsInArray:toDestroy];
-----关于绝对值:int  abs(int i); // 处理int类型的取绝对值 + float  fabsf(float i); /处理float类型的取绝对值+  double  fabs(double i); //处理double类型的取绝对值;

-----关于浮点数显示技巧:例如2.100 /2.1统一显示为2.1;将基本浮点类型转换为对象即可;

    float a = 0.1;
    float b = 0.100;
    float c = 2;
    NSLog(@"%@",[NSString stringWithFormat:@"%f",a]);            // 0.100000
    NSLog(@"%@",[NSString stringWithFormat:@"%f",b]);            // 0.100000
    NSLog(@"%@",[NSString stringWithFormat:@"%f",c]);            // 2.000000
    NSLog(@"%@",@(a));  //相当[NSNumber numberWithFloat:a]) 下同  // 0.1
    NSLog(@"%@",@(b));                                           // 0.1
    NSLog(@"%@",@(c));                                           // 2
-----程序第三方跳转,跳转完成界面控制(防止手动home键回来):在viewWillDisappear等方法中控制没效,切换到另一个程序不会调用控制器这些方法,在AppDelegate中 applicationWillResignActiveapplicationDidEnterBackground等方法中控制。如果界面控制写在第三方调用之后,有的第三方调用接口在主线程中调起,这没有问题,但有的调起,写在异步中,导致未跳到第三方之前就看到了控制界面,这方法不行。
-----判断某字符串是否含有某字符,可以 [s rangOfString:x].length 为真就行,而不用[s rangOfString:x].location < [s length]; 

      其他:

----iOS传值方式属性传值、代理传值、单例传值、通知传值、Block
-----Debug模式下不同方法入口/栈变量等信息查看:在debug模式下,在debug area可以查看当前断点处的信息,但有时想看断点之前的信息,可以通过左边的debug navigator,里面不同显示不同thread,以及该thread种不同的栈/方法入口,在每个栈/方法入口中,可以查看该栈/方法中各变量值;

你可能感兴趣的:(iOS:开发杂记(二)--sdk)