OC 是好玩的Objective-C啊

留校一个月,终于明白为什么会说这一个月学的比之前一年学的都要多了,也深切感受到了差距这个词存在的意义,所幸大家在互帮互助下都很好的完成了留校任务,真的是一年更比一年强啊,上一届留校3个项目 网易云 share 天气预报 到暑假结束才堪堪完成,今年新增了学生管理系统(封装与UI控件的结合) 我们以一周一个的速度轻松完成,并且还剩下一天半的时间可以写写总结 敲敲感想。
四个项目写下来,突然有一种无所不能的感觉,除了前面两个项目会经常和其他人交流,互相引用下各自的代码,后面的两个都是自己构思,自己实现。当然也会出现一些思路上的错误导致接下来的步骤进行不下去,多谢大佬学长学姐 总能在第一时间就找到了问题的关键,他们真的很厉害!
上周入手了索尼大法家的降噪耳机,戴上真的觉得世界就剩我一个啦 索尼大法好!!!
突然对我们的未来充满信心 哈哈哈哈哈哈哈哈哈

好啦 下面是各个项目demo
哎 一想到我gitHub被微软收购 希望这么好的开源平台不要被微软玩坏。

1.仿iOS端 天气APP
2.仿iOS端 shareApp
3.学生成绩管理系统 封装与UI
4.仿网易云界面

下面是这一个月的总结,回头再看,从最简单的获得屏幕的尺寸,到UITableView的自定义,再到present与dismiss,push与pop,再到跨页面传值,属性传值,最后是网络请求NSURLSession与前面的所有相结合出来的天气APP。真的变化好大,每一天都能感受到内在有明显的提高

期间认识了一位特别的女生,希望可以做demo.

第一周

1.:自定义单元格下拉混乱
2.可以将任何控件都加入称为导航按钮
3.UITableViewCell想改变其屏幕占比,只需设置UITableView的自适应高度即可
看这个链接
4.获取屏幕的宽度和高度:

宽度:
[UIScreen mainScreen].bounds.size.width
高度:
[UIScreen mainScreen].bounds.size.height
可以将屏幕大小定义成一个宏:
#define SCREEN_WIDTH ([[UIScreen mainScreen] bounds].size.width)
#define SCREEN_HEIGHT ([[UIScreen mainScreen] bounds].size.height)

5.在IOS7以后 ViewController 开始使用全屏布局的,而且是默认的行为通常涉及到布局,就离不开这个属性 edgesForExtendedLayout,它是一个类型为UIExtendedEdge的属性,指定边缘要延伸的方向,它的默认值很自然地是UIRectEdgeAll,四周边缘均延伸,就是说,如果即使视图中上有navigationBar,下有tabBar,那么视图仍会延伸覆盖到四周的区域。因为一般为了不让tableView 不延伸到 navigationBar 下面, 属性设置为 UIRectEdgeNone

6.在VCRoot里写 记得在VCRoot.h文件中声明!
7.UITableViewCell自定义右边的文字以及更改左边图片的大小
8. 通过tag寻找view上面的视图/控件
9.layoutSubviews的使用
10.//自定义cell的创建必须放到用到的地方 不要放在函数首部 在哪用就在哪放

cell1 = [_tableView dequeueReusableCellWithIdentifier:@"labclCell" forIndexPath:indexPath];

11.调整UIBarButtonItem的方法:

NSString * filePath1 = [[NSBundle mainBundle]pathForResource:@"2" ofType:@"png"];
    
NSData * data1 = [NSData dataWithContentsOfFile:filePath1];
UIBarButtonItem * item1 = [[UIBarButtonItem alloc]initWithImage:[self reSizeImage:[UIImage imageWithData:data1] toSize:CGSizeMake(30, 30)] style:UIBarButtonItemStyleDone target:self action:nil];

加上函数:

- (UIImage *)reSizeImage:(UIImage *)image toSize:(CGSize)reSize
{
    UIGraphicsBeginImageContext(CGSizeMake(reSize.width, reSize.height));
    [image drawInRect:CGRectMake(0, 0, reSize.width, reSize.height)];
    UIImage *reSizeImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    
    return [reSizeImage imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
}

12.设置网易云音乐的右侧灰色箭头:

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

13.处理最后一个单元格被分栏控制器遮盖

    _tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    self.edgesForExtendedLayout = UIRectEdgeAll;
    self.automaticallyAdjustsScrollViewInsets = NO;

14.在函数中直接使用section 和 row 不要再indexPath.section indexPath.row 试一下,也显示不出来
15.给UITabBarController * tabController 添加单个子控制器:

- (void)addChildViewController:(UIViewController*)childController;

16.Clear Color就是backgroundColor的alpha为1.0。

第二周

1.给当前界面设置背景图片:

self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImageimageNamed:@"title.png"]];

2.在有登录界面之后 存在有5个分栏控制器的视图 此时登录界面状态已跳出,需重设根视图。如何重设?
在点击登录按钮的事件中设置各个分栏的TabBar再加上以下代码:

根视图除了可以在AppDelegate.m文件中指定之外也可以在外面定义
// 修改根视图

AppDelegate* appDelagete = [UIApplication sharedApplication].delegate;

appDelagete.window.rootViewController = tabBarController;
上述代码中的tabBarcontroller就是要设置的根视图控制器

3.分栏控制器图标以适配的方法:

vcFiveth.tabBarItem.image = [[UIImage imageNamed:@"9.png"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
  1.  

IOS 开发中 Whose view is not in the window hierarchy 错误的解决办法

在 一个 ViewController 里面调用另外一个 ViewController 是出现这个错误:
该错误一般是由于在 viewDidLoad 里面调用引起的,解决办法是转移到 viewDidAppear 方法里面
在 AppDelegate.m 中调用遇到这个错误 
解决办法1:

CameraViewController *camera = [[CameraViewController alloc] init];
MainNavigationController *nav = [[MainNavigationController alloc] initWithRootViewController:camera];
camera.editImage.image = image;
AppDelegate *delegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
[delegate.window.rootViewController presentViewController:nav animated:YES completion:nil];
解决办法2:

UIStoryboard *mainstoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
LoginViewController* loginViewController = [mainstoryboard instantiateViewControllerWithIdentifier:@"LoginViewController"];
[self.window makeKeyAndVisible];
//[LoginViewController presentViewController:yourController animated:YES completion:nil];
//or
[LoginViewController myMethod];

5.自定义cell类不能使用普通cell的所有方法类型,比如cell.imageView.image
只能用自定义cell里面自己声明的变量去布置cell中的样式

6.1.有些时候我们想让UIButton的title居左对齐,我们设置

btn.textLabel.textAlignment = UITextAlignmentLeft

是没有作用的,我们需要设置

btn.contentHorizontalAlignment = UIControlContentHorizonAlignmentLeft;

但是问题又出来,此时文字会紧贴到左边框,我们可以设置

btn.contentEdgeInsets = UIEdgeInsetsMake(0,10, 0, 0);

使文字距离左边框保持10个像素的距离。

7.苹果8P尺寸:414 x 736
8.文章那个界面,上面最上方三个button可以用tableView的titleView来做
**9.一个总是在错的问题,给label赋值text 经常忘加text!!!! **
10.放照片时经常直接[imageArray objectAtIndex:indexPath.row];!!!

11..点击任意地方收起键盘的四种方法
12.设置键盘随视图上移的方法: ViewDidLoad中设置监听

//设置监听
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];

设置键盘上移函数:

- (void)keyboardWillChange:(NSNotification *)note
{
    NSDictionary *userInfo = note.userInfo;
    CGFloat duration = [userInfo[@"UIKeyboardAnimationDurationUserInfoKey"] doubleValue];
    
    CGRect keyFrame = [userInfo[@"UIKeyboardFrameEndUserInfoKey"] CGRectValue];
    CGFloat moveY = keyFrame.origin.y - self.view.frame.size.height;
    
    [UIView animateWithDuration:duration animations:^{
        self.view.transform = CGAffineTransformMakeTranslation(0, moveY);
    }];
}

13..关于封装,博主写的很细

14.layoutSubviews在以下情况下会被调用:

init初始化不会触发layoutSubviews
addSubview会触发layoutSubviews
设置view的Frame会触发layoutSubviews,当然前提是frame的值设置前后发生了变化
滚动一个UIScrollView会触发layoutSubviews
旋转Screen会触发父UIView上的layoutSubviews事件
改变一个UIView大小的时候也会触发父UIView上的layoutSubviews事件

15..NSRunLoop的通俗解答
16..对contentOffset的理解

第三周

1..懒加载的理解
2..代理的初步认知
3.断点调试方法
4.接口
5.耦合的理解
6.数组初始化与for循环并用时,一定要记得把数组初始化放到外面啊!!!
7.在用到NSMutableArray与UItableView结合时,直接赋值:

cell2.label.text = [_nameArray1 objectAtIndex:indexPath.row-1];

这样是不行的,text的类型没有确定。应该:

cell2.label.text = [NSString stringWithFormat:@"姓名:%@",[_nameArray1 objectAtIndex:indexPath.row-1]];

感谢学姐指点!!!
8.在协议传值过程中,用present 和 didmiss切换子界面和主界面 如果想通过协议直接在两个主界面的子界面之间相互传值 不能直接通过协议传值,因为是didmiss回去的当子界面脱离,进入主界面时 此时两个子界面都没有存在,需要先通过协议把子界面的值传入主界面,再通过属性传值的方法,把主界面的值传递给另一个子界面。
9.如果想在ViewDidload里面执行代理方法 不能直接在ViewDidLoad里面设置新界面的初始化
如下:

    addStuMsgViewController * addViewController = [[addStuMsgViewController alloc] init];
    addViewController.delegate = self;

必须在LogInViewController.h文件中设置:

{
    addStuMsgViewController * addStuViewController;
}

跟UITableView里面是实现方法一样 先在.h文件中设置UITableView * _tableView,再在,m文件中执行代理。
10.困扰了我两个小时的问题:
判断一个数组是否为空时,不能使用:

NSArray * array;
if ( array == nil )

因为此时array已经创建了一个对象。已经为其分配了内存空间,所以array的指针非空。
应该使用以下方法:

if ( [array isKindOfClass:[NSArray class]] && array.count > 0 )

11.向可变数组中添加不可变数组的方法(避免打印格式错误:)

[_mathArray1 addObjectsFromArray:_XMathArray];

12.不可变数组中添加可变数组的方法:

showStuMsgView.deleteShowArray = [NSArray arrayWithArray:_deleteLocaArray];

13.有时在数组中运用函数查找可能会因为类型错误而报错,这样做也许能解决问题:

_locaUint = [_numArray1 indexOfObject:[NSNumber numberWithInteger:_zhiweiInt]];

14.属性传值时,一定要注意初始化,这样直接传值是不行的:

[SearchViewController.numGetArray addObjectsFromArray:_getNumArray];

需要用初始化的方法传值:

SearchViewController.nameGetArray = [NSMutableArray arrayWithArray:_getNameArray];

第四周

1.解决iOS9以后Http网络协议接口奔溃方法
2..NSDictionary取值的两个方法objectForKey与valueForKey的区别
3..解析数据时,字典的快速赋值 setValuesForKeysWithDictionary
4.读取数据 取出单个元素:

NSLog(@"%@", dict[@"HeWeather6"][0][@"daily_forecast"][0][@"cond_txt_d"]);

5.cell的颜色经常会把背景色盖住,我们可以通过把cell的颜色设置为透明来显现出背景色
6.viewDidLoad 此方法只有当view从nib文件初始化的时候才被调用。viewDidLoad用于初始化,加载时用到的。
7.在网路请求与UI公用时 记得把UI的数据更新加到主线程

//把UI的更新加到主线程中
            dispatch_sync(dispatch_get_main_queue(), ^{
                [_tableView reloadData];
            });

8.在TableView上添加不移动的悬浮按钮
9.在使用可变数组的[__NSArrayI replaceObjectAtIndex:withObject:]的方法是,出现了以下错误信息: unrecognized selector sent to instance 0x60000063a480'
一直在找到底出错在了哪里,最后发现是把原来不可变数组修改成可变数组时忘了修改属性copy为strong,又找了一下为什么会因此出错?网上给出的答案是如果属性为copy 就可能会更改可变数组内部的对象属性。这个坑算是记住了。

猜你喜欢

转载自blog.csdn.net/teropk/article/details/81806478