在开发过程中遇到的零碎知识点,就把它们记录下来,方便以后回顾
iOS一些完整的项目 https://www.jianshu.com/p/c296e08d015a
//若不需要分割线可以去掉:
self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
//自定义cell,可以在cell内写一个类方法
+ (instancetype)cellWithTable:(UITableView *)tableView {
ClassCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([ClassCell class])];
if (!cell) {
cell = [[ClassCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:NSStringFromClass([ClassCell class])];
}
//取消Cell的选中效果
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}
//然后在显示cell代理里边写出对应的类方法
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
ClassCell *cell = [ClassCell cellWithTable:tableView];
cell.textLabel.text = @"cellTest";
return cell;
}
//修改Cell分割线距离:
//修改UITableviewCell的分割线距离通常需要修改separatorInset属性的top, left, bottom, right:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
if ([cell respondsToSelector:@selector(setSeparatorInset:)]) {
[cell setSeparatorInset:UIEdgeInsetsMake(0, 15, 0, 15)];
}
if ([cell respondsToSelector:@selector(setLayoutMargins:)]) {
[cell setSeparatorInset:UIEdgeInsetsMake(0, 15, 0, 15)];
}
if ([cell respondsToSelector:@selector(setPreservesSuperviewLayoutMargins:)]) {
[cell setPreservesSuperviewLayoutMargins:NO];
}
}
修改UIPageControl图片
//当前点击图片
[self.pageControl setValue:currentImage forKey:@"_currentPageImage"];
//默认状态图片
[self.pageControl setValue:pageImage forKey:@"_pageImage"];
当网络请求时可能会遇到请求参数带有汉字等怪异的字符时可以做如下处理
//由于url支持26个英文字母、数字和少数几个特殊字符,因此,对于url中包含非标准url的字符时,就需要对其进行编码。iOS中提供了函数stringByAddingPercentEscapesUsingEncoding对中文和一些特殊字符进行编码
NSString *str = @"http://218.21.213.10/MobileOA/TIFF/鄂安办发45号关于下达2012年全市安全生产相对控制指标的通知1.jpg";
str = [str stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
//但是stringByAddingPercentEscapesUsingEncoding的功能并不完善,对一些较为特殊的字符无效。而对这些字符则可以使用CFURLCreateStringByteAddingPercentEscapes函数
[self URLEncodedString:url];
- (NSString *)URLEncodedString:(NSString*)resource {
CFStringRef url = CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault, (CFStringRef)resource, NULL, CFSTR("!*'();:@&=+$,/?%#[]"), kCFStringEncodingUTF8); // for some reason, releasing this is disasterous
NSString *result = (__bridge NSString *)url;
return result;
}
当遇到再WebView中返回视频和依然音频播放的问题时:
//在viewWillAppear中加入play方法播放
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear: animated];
[self.navigationController setNavigationBarHidden:true animated:true];
[self.wkWebView evaluateJavaScript:@"$('audio').trigger('play');" completionHandler:nil];
[self.wkWebView evaluateJavaScript:@"$('video').trigger('play');" completionHandler:nil];
}
//在viewWillDisappear中加入pause的方法暂停
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.navigationController setNavigationBarHidden:false animated:true];
// [self.wkWebView reload];
[self.wkWebView evaluateJavaScript:@"$('audio').trigger('pause');" completionHandler:nil];
[self.wkWebView evaluateJavaScript:@"$('video').trigger('pause');" completionHandler:nil];
}
让视图单独显示某一侧的边框线
- (void)setBorderWithView:(UIView *)view top:(BOOL)top left:(BOOL)left bottom:(BOOL)bottom right:(BOOL)right borderColor:(UIColor *)color borderWidth:(CGFloat)width
{
if (top) {
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(0, 0, view.frame.size.width, width);
layer.backgroundColor = color.CGColor;
[view.layer addSublayer:layer];
}
if (left) {
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(0, 0, width, view.frame.size.height);
layer.backgroundColor = color.CGColor;
[view.layer addSublayer:layer];
}
if (bottom) {
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(0, view.frame.size.height - width, view.frame.size.width, width);
layer.backgroundColor = color.CGColor;
[view.layer addSublayer:layer];
}
if (right) {
CALayer *layer = [CALayer layer];
layer.frame = CGRectMake(view.frame.size.width - width, 0, width, view.frame.size.height);
layer.backgroundColor = color.CGColor;
[view.layer addSublayer:layer];
}
}
viewcontroller生命周期
-(void)loadView {
[super loadView];
NSLog(@"控制器的loadView");
}
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"控制器的viewDidLoad加载完毕");
}
// 控制器的view即将显示的时候调用
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:YES];
NSLog(@"1控制器的view即将显示");
}
// 控制器的view完全显示的时候调用
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
NSLog(@"1控制器的view完全显示");
}
// 控制器的view即将消失的时候调用
- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];
NSLog(@"1控制器的view即将消失");
}
// 控制器的view完全消失的时候调用
- (void)viewDidDisappear:(BOOL)animated
{
[super viewDidDisappear:animated];
NSLog(@"1控制器的view完全消失");
}
// 控制器的view即将销毁的时候调用
- (void)viewWillUnload
{
[super viewWillUnload];
}
// 控制器的view完全销毁的时候调用
- (void)viewDidUnload
{
[super viewDidUnload];
// 清空不需要的属性
// [self.foods release];
}
// 接收到内存警告的时候调用
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
}
Xcode 8.0 中去掉注释中 报警告
消除Xcode警告iOS系统库头文件中NS_AVAILABLE相关
NS_AVAILABLE_IOS(5_0)
这个方法可以在iOS5.0及以后的版本中使用,如果在比5.0更老的版本中调用这个方法,就会引起崩溃。
NS_DEPRECATED_IOS(2_0, 6_0)
这个宏中有两个版本号。前面一个表明了这个方法被引入时的iOS版本,后面一个表明它被废弃时的iOS版本。被废弃并不是指这个方法就不存在了,只是意味着我们应当开始考虑将相关代码迁移到新的API上去了。
NS_AVAILABLE(10_8, 6_0)
这个宏告诉我们这方法分别随Mac OS 10.8和iOS 6.0被引入。
NS_DEPRECATED(10_0, 10_6, 2_0, 4_0)
这个方法随Mac OS 10.0和iOS 2.0被引入,在Mac OS 10.6和iOS 4.0后被废弃。
NS_CLASS_AVAILABLE(10_11, 9_0)
这个类分别随Mac OS 10.11和iOS9.0被引入。
NS_ENUM_AVAILABLE(10_11, 9_0)
这个枚举分别随Mac OS 10.11和iOS9.0被引入。
POST请求参数字典写法
NSNumber *packId = @2;
NSNumber *userId = @22;
NSString *title = @"titleView";
NSDictionary *param = NSDictionaryOfVariableBindings(packId,userId,title);
NSLog(@"%@",[self jsonStrWithDict:param]);
- (NSString *)jsonStrWithDict:(NSDictionary *)dict
{
if (!dict) return @"";
NSData* jsonData = nil;
NSError *error = nil;
jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:&error];
if (error)
{
return @"json转换错误";
}
return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
}
NSlog输出结果:
{
"title" : "titleView",
"packId" : 2,
"userId" : 22
}
关于AFNetworking请求问题
AFNetWorking请求每次进failure,status code: 500
解决方法:添加一行代码
manager.requestSerializer = [AFJSONRequestSerializer serializer];
问题原因:我的服务端期待的是 POST body 直接是 JSON 格式这种形式。而我没有设置上面的那句代码,AFN默认是以
paramRequest 这个 Dictionary 是用表单参数的方式序列化为 POST body 来提交的
网友评论