iOS_开发中遇到的那些问题_4

【自编号:493】【点击cell里面的按钮时,直接在block里回传self即可,即cell,让控制器的tableView根据cell获取到indexPath】【2015-07-22 16:01:03 by beyond】



【自编号:494】【Label显示金额时,直接%@NSNumber即可】【2015-07-22 16:01:39 by beyond】



【自编号:495】【iOS7自动计算cell高度】 【查看原文】 【2015-07-23 11:40:30 by beyond】



【自编号:496】【通过Notification让Ctrl进行push时,如果该ctrl不是处于navigationCtrl子控制器数组的最后一个时,push后导航栏会乱掉】
    NSArray *ctrls = self.navigationController.childViewControllers;
    // 先取到导航控制器子控制器数组中,最后一个,让它进行push,这样,导航栏就不会暴走了
    UIViewController *lastCtrl = [ctrls lastObject];
    [lastCtrl.navigationController pushViewController:controller animated:YES];
【2015-07-23 14:33:17 by beyond】



【自编号:497】【一个有导航栏的控制器跳到全屏控制器时,导航栏的标准处理】
一个有导航栏的控制器:(默认不需任何处理)

一个全屏的控制器:
- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    
    KLNavigationBarHidden
}
- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.netManager cancel];
    [SVProgressHUD dismiss];
    
    KLNavigationBarShow
}

#define KLNavigationBarHidden [self.navigationController setNavigationBarHidden:YES animated:YES];
#define KLNavigationBarShow [self.navigationController setNavigationBarHidden:NO animated:YES];
【2015-07-23 14:36:13 by beyond】



【自编号:498】【手机号验证,待验证】
// 判断是否是手机号
+ (BOOL)isValidPhone:(NSString *)phone
{
    if (phone.length != 11)
    {
        return NO;
    }
    else
    {
        /**
         * 移动号段正则表达式
         */
        NSString *CM_NUM = @"^((13[4-9])|(147)|(15[0-2,7-9])|(178)|(18[2-4,7-8]))\\d{8}|(1705)\\d{7}$";
        /**
         * 联通号段正则表达式
         */
        NSString *CU_NUM = @"^((13[0-2])|(145)|(15[5-6])|(176)|(18[5,6]))\\d{8}|(1709)\\d{7}$";
        /**
         * 电信号段正则表达式
         */
        NSString *CT_NUM = @"^((133)|(153)|(177)|(18[0,1,9]))\\d{8}$";
        NSPredicate *pred1 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM_NUM];
        BOOL isMatch1 = [pred1 evaluateWithObject:phone];
        NSPredicate *pred2 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU_NUM];
        BOOL isMatch2 = [pred2 evaluateWithObject:phone];
        NSPredicate *pred3 = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT_NUM];
        BOOL isMatch3 = [pred3 evaluateWithObject:phone];
        
        if (isMatch1 || isMatch2 || isMatch3) {
            return YES;
        }else{
            return NO;
        }
    }
}

【2015-07-24 12:03:26 by beyond】



【自编号:499】【去掉输入框两端的空格】
_xib_name.delegate = self;
// 输入框去掉两端的空格
- (void)textFieldDidEndEditing:(UITextField *)textField
{
    NSString *str = textField.text;
    str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    textField.text = str;
}
【2015-07-29 10:04:13 by beyond】



【自编号:502】【iOS_KVO运行时会生成一个派生类】
因为Cocoa是严格遵循MVC模式的,所以KVO在观察Modal的数据变化时很有用。那么KVO是怎么实现的呢,苹果官方文档上说的比较简单:“Automatic key-value observing is implemented using a technique called isa-swizzling.”
       “When an observer is registered for an attribute of an object the isa pointer of the observed object is modified, pointing to an intermediate class rather than at the true class. As a result the value of the isa pointer does not necessarily reflect the actual class of the instance.”
        就是说在运行时会生成一个派生类,在这个派生类中重写基类中任何被观察属性的 setter 方法,用来欺骗系统顶替原先的类。
【查看原文】 【2015-07-31 09:47:42 by beyond】



【自编号:503】【iOS_判断字典中是否有某个key】
keyEnumerator
Returns an enumerator object that lets you access each key in the receiver.

- (NSEnumerator *)keyEnumerator

Return Value
An enumerator object that lets you access each key in the receiver.

Discussion
The following code fragment illustrates how you might use this method.


NSEnumerator *enumerator = [myDictionary keyEnumerator];
id key;

while ((key = [enumerator nextObject])) {
    /* code that uses the returned key */
}

If you use this method with instances of mutable subclasses of NSDictionary, your code should not modify the entries during enumeration. If you intend to modify the entries, use the allKeys method to create a “snapshot” of the dictionary’s keys. Then use this snapshot to traverse the entries, modifying them along the way.

Note that the objectEnumerator method provides a convenient way to access each value in the dictionary.

Availability
Available in iPhone OS 2.0 and later.
See Also
– allKeys
– allKeysForObject:
– getObjects:andKeys:
– objectEnumerator
– nextObject (NSEnumerator)
Declared In
NSDictionary.h

// >>>>>>>>>>>>关注状态
    NSInteger forCtrlUsedAttention;
    // 首次点击时,通过 通知传递过来的 状态
    NSInteger firstAttention = [[dict objectForKey:@"IsAttented"]integerValue];
    // 从缓存字典中取出来的 数目
    BOOL isAlreadyCached = NO;
    NSEnumerator *enumerator = [_attentionStatusDict keyEnumerator];
    NSString *key;
    
    while ((key = [enumerator nextObject])) {
        /* code that uses the returned key */
        if ([key isEqualToString:beautyId]) {
            isAlreadyCached = YES;
            break;
        }
    }
    if(isAlreadyCached){
        // 如果有key,则使用缓存过的attentStatus
        forCtrlUsedAttention = [[_attentionStatusDict objectForKey:beautyId]integerValue];
    }else{
        // 没有key,说明没有缓存过,使用原始的attentStatus
        forCtrlUsedAttention = firstAttention;
    }
    
    // 最后一步,也最关键,使用 比较后的关注状态
    [mDict setObject:@(forCtrlUsedAttention) forKey:@"IsAttented"];
【2015-07-31 09:48:46 by beyond】



【自编号:505】【正则去html标签】
/<\/?[^>]*>/g
首先:精华是:<\/?[^>]*>
并且可以一分为二:<[^>]*> 和 <\/[^>]*>
其实:第1个对应的是:标签头,第2个正则对应的是标签尾
精华:[^>]*  表示的是任意多个 除了>的字符
【2015-07-31 11:12:39 by beyond】



【自编号:506】【iOS_简易toast】
#pragma mark - 新增工具方法
-(void)showMessage:(NSString *)message
{
    UIWindow * window = [UIApplication sharedApplication].keyWindow;
    UIView *showview =  [[UIView alloc]init];
    showview.backgroundColor = [UIColor blackColor];
    showview.frame = CGRectMake(1, 1, 1, 1);
    showview.alpha = 1.0f;
    showview.layer.cornerRadius = 5.0f;
    showview.layer.masksToBounds = YES;
    [window addSubview:showview];
    
    UILabel *label = [[UILabel alloc]init];
    CGSize LabelSize = [message sizeWithFont:[UIFont systemFontOfSize:17] constrainedToSize:CGSizeMake(290, 9000)];
    label.frame = CGRectMake(10, 5, LabelSize.width, LabelSize.height);
    label.text = message;
    label.textColor = [UIColor whiteColor];
    label.textAlignment = 1;
    label.backgroundColor = [UIColor clearColor];
    label.font = [UIFont boldSystemFontOfSize:15];
    [showview addSubview:label];
    CGFloat SCREEN_WIDTH= window.frame.size.width;
    CGFloat SCREEN_HEIGHT= window.frame.size.height;
    showview.frame = CGRectMake((SCREEN_WIDTH - LabelSize.width - 20)/2, SCREEN_HEIGHT - 100, LabelSize.width+20, LabelSize.height+10);
    [UIView animateWithDuration:1.5 animations:^{
        showview.alpha = 0;
    } completion:^(BOOL finished) {
        [showview removeFromSuperview];
    }];
}
【2015-07-31 14:41:20 by beyond】



【自编号:507】【iOS_数值相乘】
- (NSString *)decimalNumberMutiplyWithString:(NSString *)multiplierValue andString:(NSString *)multiplicandValue
{
    DLog(@"%@----%@",multiplicandValue,multiplicandValue);
    NSDecimalNumber *multiplierNumber = [NSDecimalNumber decimalNumberWithString:multiplierValue];
    NSDecimalNumber *multiplicandNumber = [NSDecimalNumber decimalNumberWithString:multiplicandValue];
    NSDecimalNumber *product = [multiplicandNumber decimalNumberByMultiplyingBy:multiplierNumber];
    NSString * result = [product stringValue];
    DLog(@"乘积:%@",result);
    return result;
}
【2015-07-31 16:59:36 by beyond】



【自编号:512】【iOS_urlScheme】
targets-->info--->url types identifier建议使用反向域名,如:com.beyond.nihongo schemes使用诸如:nihongo等,一个identifier可以添加多个schemes 则在safari使用:nihongo://adsfadsfadsf就可以调起app
【查看原文】 【2015-08-04 16:24:43 by beyond】



【自编号:514】【一次由于xib缓存导致的问题】
问题描述:一个label死活不显示
断点打印:发现它没有被隐藏,有正常的frame
转折点:通过xcode自带的底部的Debug View Hierarchy 按钮,(或者从菜单中选择Debug > View Debugging > Capture View Hierarchy 来启动视图调试),发现该label被一个大图片盖住了,但是!!从xib表面上看到没有盖住!
最终解决方案:重启xcode,再次打开xib发现,确实被大图片盖住了!!!
附:UIView如何切换两个View的层次 
1.[self.view bringSubviewToFront:view2];
将view2放置到最顶层,index自动管理,还有对应的一个方法好象是sendback
2.[self.view addSubview:view2];
将view2加到当前视图的上一层,index在上一层的基础上自动+1
【2015-08-06 17:06:39 by beyond】



【自编号:515】【两个滑块的滑杆,数值范围选择】 【查看原文】 【点击下载】 【2015-08-07 10:13:07 by beyond】



【自编号:516】【textView边框和占位(含颜色)】
#define kMsgTextViewHolder @"如有特别要求,请输入留言信息"
- (void)diy_textView
{
    _xib_textView_msg.delegate = self;
    _xib_textView_msg.textColor = [UIColor lightGrayColor]; //optional
    _xib_textView_msg.layer.borderWidth = 0.5;
    _xib_textView_msg.layer.borderColor = [kColor(190, 190, 190)CGColor];
}
#pragma mark - textView代理
- (void)textViewDidBeginEditing:(UITextView *)textView
{
    if ([textView.text isEqualToString:kMsgTextViewHolder]) {
        textView.text = @"";
        textView.textColor = [UIColor blackColor]; //optional
    }
    [textView becomeFirstResponder];
}

- (void)textViewDidEndEditing:(UITextView *)textView
{
    NSString *str = textView.text;
    str = [str stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    textView.text = str;

    if ([textView.text isEqualToString:@""]) {
        textView.text = kMsgTextViewHolder;
        textView.textColor = [UIColor lightGrayColor]; //optional
    }
    [textView resignFirstResponder];
}

【2015-08-07 11:11:00 by beyond】



【自编号:517】【如何让xib生成的scrollView:即便内容很少很短,也能在不同的屏幕上滚动】
例如:scrollView里面最下方的是一个btn,则在xib时,btn距离下方为:推荐值+1个像素,
并且:(最重要的是)将该约束iboutlet,在控制器中,根据不同的屏幕高度重置其值为:
scrollView的高度-getMaxY(btn.frame)+1即可解决!!!
【2015-08-07 16:31:37 by beyond】



【自编号:518】【xib最右边的窗口里的某一条约束,点击del无法删除,只有点击Backspace才可以删除】【2015-08-07 17:32:10 by beyond】



【自编号:519】【xib初始自定义View时走的方法】
自定义的控件如何在xib中使用,自定义控件在xib中的初始化入口函数
最重要的一点是实现
- (id)initWithCoder:(NSCoder*)coder  
{  
    self = [super initWithCoder:coder];  
    if (self) {  
        // Initialization code  
    }  
    return self;  
}  
这是通过xib添加的控件,设置自定义类型后,控件的初始化函数,
也就是说xib初始化这个控件的时候是从initWithCoder进入的
【2015-08-10 10:09:12 by beyond】



【自编号:520】【按钮点击时的白点:showsTouchWhenHighlighted】【2015-08-10 10:16:33 by beyond】



【自编号:521】【github_日历选择View_FSCalendar】 【点击下载】 【2015-08-11 10:53:32 by beyond】



【自编号:522】【dealloc调试】
- (void)dealloc
{
    NSLog(@"%@:%s", self.class.description, __FUNCTION__);
}
【2015-08-11 14:11:26 by beyond】



【自编号:523】【NSDate_8个小时差】
NSDate *currentDate = [NSDate date];
    //2015-08-11 06:53:38 +0000
    NSTimeZone *systemZone = [NSTimeZone systemTimeZone];
    //Asia/Shanghai (GMT+8) offset 28800
    NSInteger second_interval = [systemZone secondsFromGMTForDate: currentDate];
    //28800
    NSDate *localeDate = [currentDate  dateByAddingTimeInterval: second_interval];
    // 2015-08-11 14:53:38 +0000
    NSLog(@"修正后的:currentDate=%@",localeDate);
    // 修正后的:currentDate=2015-08-11 14:53:38 +0000
【2015-08-11 14:55:43 by beyond】



【自编号:525】【iOS Crash 分析】 【查看原文】 【2015-08-11 18:54:56 by beyond】



【自编号:528】【IOS各种调试技巧豪华套餐】 【查看原文】 【2015-08-12 16:40:50 by beyond】



【自编号:529】【xcode_编译链接运行后,直接弹出不能启动app】
则:试试targets-->build settings-->描述文件-->debug-->Automatic试试
【2015-08-13 15:09:35 by beyond】



【自编号:530】【imgView突然无法点击】
首先排查是不是手动禁用了其用户交互性
【2015-08-13 15:10:41 by beyond】



【自编号:531】【固定高度的cell强烈建议self.tableView.rowHeight = kCellHeight;而非实现代理方法】【2015-08-14 10:07:27 by beyond】



【自编号:532】【找不到provisioning】
failed to code sign XXX
however,no such provisioning profile was found
解决方法:导入.mobileprovision
【2015-08-14 11:23:50 by beyond】



【自编号:533】【约束莫名异常】
如果约束设置正确,但是在viewDidLoad时,重新设置了约束值后,
界面出现显示卡顿等异常(如scrollView变得可以左右滑动了),并且命令行抛出autoLayout异常
那么:很可能少了很关键的一句话[self.view layoutIfNeeded];
【2015-08-14 15:17:17 by beyond】



【自编号:534】【优化UITableViewCell高度计算的那些事】
UITableView+FDTemplateLayoutCell
【查看原文】 【2015-08-14 18:06:31 by beyond】



【自编号:535】【关于 UITableView 中 cell 自适应高度的问题】 【查看原文】 【2015-08-14 18:06:55 by beyond】



【自编号:536】【点击cell,切换选中图片,千万不要使用imageView自带的state为highlighted属性】
必须使用原生的方法根据状态设置图片:
    if (model.isSelected) {
        //
        _checkImgView.image = [UIImage imageNamed:@"buttons_boxes_p.png"];
    } else {
        //
        _checkImgView.image = [UIImage imageNamed:@"buttons_boxes_n.png"];
    }

#pragma mark - 点击Cell跳转tableView的代理方法
// 已写好,子类不用动(设置默认收获地址(点击cell的时候,提交请求,并更改效果,并返回))
- (void) selectRowAtIndexPath:(NSIndexPath *)indexPath
{
    // 取到模型
    Model_Class *model = [self.arrayData objectAtIndex:indexPath.row];
    model.isSelected = !model.isSelected;
    // 添加到数组
    if (model.isSelected) {
        [_selectedIDStrArr addObject:model.Id];
    } else {
        [_selectedIDStrArr removeObject:model.Id];
    }
    DLog(@"选中的:%@",_selectedIDStrArr);
    // 刷新当前行
    [self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationAutomatic];
//    [self.tableView reloadData];
}
【2015-08-17 10:32:51 by beyond】



【自编号:537】【不让cell出现点击效果】
// BaseListViewCtrl会调用,常用于 手动对xib中的元素 作一定的定制
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    NSArray *arrayXibObjects = [[NSBundle mainBundle] loadNibNamed:kCellID owner:nil options:nil];
    self = [arrayXibObjects lastObject];
    // 不让cell出现点击效果
    self.selectionStyle = UITableViewCellSelectionStyleNone;
    return self;
}
【2015-08-17 14:17:54 by beyond】



【自编号:539】【64位不要用numberWithInt,会崩溃掉】
@"FCount":[NSNumber numberWithInteger:1],
@"FCount":@(1l),
【2015-08-18 14:00:12 by beyond】



你可能感兴趣的:(ios,问题,xcode)