1.使用场景:在进入C控制器,可能有两个入口A和B控制器,从哪个入口进来,点击返回就返回哪个控制器。这样我们可以在C控制器中写上这个导航控制器的方法来判断,控制器栈中存在的是是否存在A或者B控制器,如果有A代表从A入口进来,那么就返回A,B则同义。
UIViewController *VC = [self.navigationControllerviewControllerWithName:@"AViewController"];
【下面是导航控制器的分类方法
- (UIViewController *)viewControllerWithName:(NSString *)_name {
Class cls = NSClassFromString(_name);
for (UIViewController *vcinself.viewControllers) {
if ([vcisKindOfClass:cls]) {
return vc;
}
}
returnnil;
}】
if(VC isKindOfClass:[NSClassFromString[A class]]){
则返回A;
}esle{
则返回B。
}
OK到这里,你应该理解了把?
2.实现对象的复制
对象实现NSCopy协议, 对象的.m写上下面这段代码,用C的函数比较多,外部调用直接使用[对象 copy]
- (id)copyWithZone:(NSZone *)zone{
id flightList = [[[selfclass]allocWithZone:zone] init];
size_t instanceSize =class_getInstanceSize([selfclass]);
memcpy((__bridgevoid *)(flightList), (__bridgeconstvoid *)(self), instanceSize);
return flightList;
}
3.
-(void)sizeToFit;这个可以主动调用,会自动调用sizeThatFits,不应该被重写,可以重写sizeThatFits。
-(void)sizeThatFits;可以计算去调用者被填充内容后的宽高。传入的参数是receiver当前的size,返回一个适合的size。
使用场景:return [self.txtViewTips sizeThatFits:CGSizeMake(SCREEN_WIDTH,FLT_MAX)].height;可以得到UITextView被填充文字后的高度。
FLT_MAX表示的是CGFloat可以表示的最大数。
4.正常情况下向已经回收的对象发送消息时灵时不灵,具体要看该对象所占内存有没有被覆写。coco提供了僵尸对象(zombie Object)这个功能,简单的说:弃启用该调试功能后,运行时会将所有已回收的实例转化为特殊的“僵尸对象”,而不会真正回收它们。这种对象在核心内存无法重用,因此不可能遭到覆写。僵尸对象受到消息后悔抛出异常,其中说明了发送来的消息,并描述了回收之前的对象。僵尸对象是调试内存管理问题的最佳方式。
5.判断字符串是否包含字母,网上找的正则都太不靠谱了,自己撸了一个方法 根据大小写字母的ascii来判断
/* 判断是否包含包含字符返回包含字符的长度 */
NSInteger letterCount =0;
for (int i =0; i <applicantName.length; i++) {
int asciiCode1 = [applicantNamecharacterAtIndex:i];
if ((asciiCode1>64 && asciiCode1<91) || (asciiCode1>96 && asciiCode1<123)) {
letterCount ++;
}
}
6.RGB颜色宏定义
#define RGBA(r,g,b,a) [UIColor colorWithRed:(float)r/255.0f green:(float)g/255.0f blue:(float)b/255.0f alpha:a]
7.16进制宏定义
#define UIColorFromRGB(rgbValue) [UIColor colorWithRed:((float)((rgbValue &0xFF0000) >>16))/255.0 green:((float)((rgbValue &0xFF00) >>8))/255.0 blue:((float)(rgbValue &0xFF))/255.0 alpha:1.0]
8.获取一个view视图的所在控制办法
- (UIViewController *)viewController {
for (UIView* next = [self.customViewsuperview]; next; next = next.superview) {
UIResponder *nextResponder = [nextnextResponder];
if ([nextResponderisKindOfClass:[UIViewControllerclass]]) {
return (UIViewController *)nextResponder;
}
}
returnnil;
}
9.iOS7之后的导航栏遮盖问题
self.extendedLayoutIncludesOpaqueBars = NO;
self.edgesForExtendedLayout = UIRectEdgeBottom | UIRectEdgeLeft | UIRectEdgeRight;
tabbar遮挡内容 同样的解决办法,只要将UIRectEdgeBottom去掉即可
10.xib的UI控件frame加载时间
记得之前一值纳闷在xib中的控制器view宽度为320,但是当加载到屏幕宽度为375的屏幕时候,这个view就变成了屏幕的宽度375;之前一直纳闷什么时候拿到才是375呢,这个中间节点在哪呢。其实是在viewDidAppear,当在这个方法之前的拿到的都是320,在这个方法以及之后就是真正加载出来的那个frame。
11.还有一个疑问,练习page的这个,加约束显示不加不显示,有时间深究下
12.命名导入一个cell,但是却一直写不出来报错,说不存在
上午在一个控制器中导入一个cell,明明#import导入进去了,但是却一直不能写出来这个cell,一直报错,最终的原因查出来了,是因为在项目中存在两个不同路径单一个名字这样的cell,所以编译器不知道你要使用的是哪一个,一直报错说不存在。找到原因是拿Sublime这个编辑器全局搜索的出来的发现两个路径。
13.textView可以通过简单的配置自动识别常见格式的电话号码,但是有些非正常格式的例如95511,这个时候需要通过一些其他的配置来实现:下面贴出来代码:
NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc] initWithString:self.responseGetVisaOrderDetail.visaLogisticsInfo.logisticPhone
attributes:@{NSFontAttributeName:font_Info,
NSForegroundColorAttributeName:RGBA(0, 160, 255, 1)}];
[attributedString addAttribute:NSLinkAttributeName value:[NSURL URLWithString:[NSString stringWithFormat:@"tel://%@",self.responseGetVisaOrderDetail.visaLogisticsInfo.logisticPhone]] range:NSMakeRange(0,self.responseGetVisaOrderDetail.visaLogisticsInfo.logisticPhone.length)];
self.phoneRightTxtView.attributedText = attributedString;
-(BOOL)textView:(UITextView *)textView shouldInteractWithURL:(NSURL *)URL inRange:(NSRange)characterRange{
return YES;
}