IOS - Objective C 学习笔记

什么是iOS?

iOS是由苹果开发的移动操作系统。

苹果台式机操作系统?

MAC OS

开发环境?

Mac OS + xcode。

常用命令?

Command + R = 运行
Command + N = 新建

Swift语言是苹果公司于2014年6月的WWDC大会上发布的一种新的语言,由苹果公司完全开发,未来将替代objective-c。
作为开发者首先得有一个AppleID(开发者账号)
iOS开发,仅在模拟器上运行是免费的
什么是模拟器?

Xcode安装好后,就默认安装了iOS 模拟器,可以方便地运行自己开发的App。值得一提的是,与一般人对模拟器的印象不同iOs模拟器的运行速度非常快,有时候甚至比真机还快,-点都不卡,启动速度也很快,使用起来令人感觉愉快

Singe view application 能跳转页面
主页两种框架:

Main storyboard(拖控件)
launchscreen (纯代码)
默认为(main storyboard)

AppDelegate 程序代理入口

AppDelegate (处理应用程序生命周期的各个事件响应)
ViewController(视图控制器)
rootViewController (根视图控制器),没有设置背景默认为黑色

创建UILabel对象

UILabel *label = [UILabel new ]
UILabel *label =[[UILabel alloc] init]

异步执行

有个概念叫异步执行 与之 相对的是同步执行。同步执行就是一 步步按部就班的执行,当前任务为未完成,则当前线程陷入阻塞状态,直到任务完成才运行下一个任务。而异步执行则灵活得多,指定一个任务运行后,不管任务有没有完成,马上就返回执行下一个任务。之前的任务完成后,框架会自动调用写好的回调函数来处理善后。

UIViewController管理着视图的生命周期:

(1)视图加载完毕
(2)视图将显示
(3)视图已显示
(4)视图将消失
(5)视图已消失

什么是协议?

协议与代理是Objective C语言的概念,与其他的语言的名词差别很大。协议可以看作Java等语言中的接口,或者抽象类即只有方法定义,却不实现方法。

扫描二维码关注公众号,回复: 11335049 查看本文章

代理是实现了协议的对象,可以看作Java等语言中实现了某接口或抽象类的对象

协议 == 接口 || 抽象类

代理 == 接口的实现类 || 抽象类实现类

target 与 selector?

target : 用来指定事件由某个对象处理
selector:用来指定某个方法作为执行响应事件

NSNotification消息中心?

有些事件不是由硬件中断产生。比如键盘收起事件等。。。。这些事件一般通过Cocoa的通知中心机制来广播。

viewDidLoad方法中创建视图、控件、以及指定响应方法。
UIView基本属性

CGRect类型的结构体:
包含了位置+大小
(CGPoint+CGSize)==(X,Y+W,H)

(1)frame:规定视图大小和位置
(X,Y,W,H)其中X,Y可以变化 ,代表相对于其父view 的位置

(2)bounds:规定视图大小和位置
(X,Y,W,H)其中X,Y永远为 (0,0)

CGPoint类型的结构体:

(3)center:定义视图中心点在父视图的坐标,CGPoint类型;

UIContro

UIContro默认可以接受触摸事件,并且对接受的触摸事件做了很详细的区分,可以很方便地定制需要响应的事件。

什么是控件?

UIContro是所有控件的父类,所谓控件就是能够接受用户的触摸操作,并对其做出响应的UI组件

按钮、开关、分段控件、进度条等
4个不同事件的响应方法
(1)按下(TouchDown)

(2)在按钮内部松开手指(TouchUpInside)

(3)在按钮外部松开手指(TouchUpOutside)

(4)按下不放移动手指直到手指离开按钮边界(TouchDragExit)
制作计算器

alloc = 指针
CGRectMake:所有控件都通过其画出

result = [[UILabel alloc] initWithFrame: CGRectMake(0,44.0,width,labelHeight - 44.0)];
添加响应事件

self:在父视图执行
@selector()指明方法

[btn[16]	addTarget:self action:@selector(onPress:)	forControllerEvents:UIControllerEventTouchUpInside];
各按钮的响应方法都用同一个onPress 通过各个按钮的tag值来区分
开关控件:UISwitch
滑块控件:UISlider 范围为0-1
分段控件:UISegmentefControl

通过UISegmentefControl对象的selectedSegmentIndex属性得知当前所选的index,从而做出响应。

NSLog();控制台输出
UITextField

为了控制其输入过程中的诸多事件,实现UITextFieldDelegate协议

用的比较多的是textFieldDidEditing
法,用于在用户结束编辑时的处理工作。

UITextView

用于展示大段文本(多行)
有一个BOOL类型属性editable来控制是否可编辑
添加 tv控件 到父视图上
[self.view addSubview:tv];

日期选择器 UIDatePicker

(1)UIDatePickerModeTime --仅显示和选择时|分


(2)UIDatePickerModeDate --仅显示和选择 年|月|日 》》》》 重点关注


(3)UIDatePickerModeDateAndTime --仅显示和选择年|月|日|时|分等


(4)UIdateModeCountDownTimer 用以计时,选择小时数和分钟数: 小时|分钟

NSDateFormatter类

常用的用法如:

NSDateFormatter *df =[[NSDateFormatter alloc] init];
df.dateFormat = @"yyyy-MM-dd HH:mm:ss";  
NSString *dateString = [df	stringFromDate:[NSDate date]];
NSDate *date = [df dateFromString:@"2015-12-01 20:05:23"]; 
自定义选择器UIPickerView

UIPickerView 的代理有两个与其对应的协议

(1)dataSource    其协议(实现类)UIPickerViewDateSource   用来提供显示的内容。

(2)delegate	其协议(实现类)UIPickerViewDelegate   用来处理选择器的事件。

指定多少列

-(NSInteger)numberOfComponentsInPickerView:(UIPickerView*)pickerView
{
    return 1; // 返回1表明该控件只包含1列
}

指定多少行的

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
	if ( component == 0 )
	{
		return(province.count);
	}else if ( component == 1 )
	{
		return([cities[curProvince] count]);
	}else{
		return([areas[curProvince] [curCity] count]);
	}
	return(_teams.count);
}

设置要显示的标题

- (NSString *)pickerView:(UIPickerView *)pickerView
       titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
	if ( component == 0 )
	{
		return([provinces:row]);
	}else if ( component == 1 )
	{
		return(cities[curProvince][row]);
	}else{
		return(areas[curProvince][curCity][row]);
	}
}

当省份或城市改变时,后面的列的显示需要相应的更新

- (void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
	if ( component == 0 )
	{
		curProvince = row;
	}else if ( component == 1 )
	{
		curCity = row;
	}else{
		curArea = row;
	}
	[pickerView reloadAllComponents];
}
网页控件 UIWebView

web.delegate = self; //代理 = 本身

在UITextField中触发一次URL请求

NSURL *url = [NSURL URLWithString:textField.text];
NsRequest *req = [NSURLRequest requestWithURL:url];
[web loadRequest:req];
导航栏一定在屏幕最上方
工具栏一般在屏幕最下方

创建一个工具栏

UIToolBar toolBar =[ [UIToolBar alloc] iniWithFrame:CGRectMake(0,self.view.frame.size.height - 44,self.view.frame.size.width,44)];
tooBar.items = @[item1,space,item2,space,item3];//按钮组加入工具栏
导航栏UINavigationBar

_windows.rootViewController = nav;

导航控制器的本质:

(1)维护了一个控制器的栈
(2)栈结构是先进后出的结构
(3)栈的好处,在于可以记忆最近做的事
(4)新切入一个页面时,栈会新压入一个控制器
(5)退出当前页面时,栈也相应地弹出当前控制器

常用属性:

navigationItem  用来定义顶部导航栏的标题与左右侧按钮、图片的

navigationController  可直接访问导航控制器本身(比如推入新页面或退出当前页)
Storyboard 可视化编辑界面

去掉 Use Auto LayoutUse Size Classes 就可以往界面添加按钮(真的这样??)

UIStoryborad 类

需用到identifier 加载UIviewController对象

Navigation Controller带有2个界面,左边是NavigationController,右边是 root view controller

Modal 连线中间设置一个segue 也就是跳转

navigation controller 不能选择Push跳转, 但可以选Modal

警告框 UIAlertController控制器

警告框是一个模态对话框(modal dialog)会暂时中断其他操作。

iOS8以前是有专门的视图类,不过后面被抛弃了

UIAlertController 有两种样式(但它两不是同一种控件)
(1)警告框
(2)操作表

UIAlertActionStyleDestructive 破坏性操作   红色

UIAlertActionStyleDefault  默认项   黑色
活动指示器 UIActivityIndicatorView

用于某些时间较长的操作,如网络获取数据等。。。

UITableView由很多节(section)构成,每一节有头有尾,中间由一个个单元格(cell)构成
UITableViewCell的四种基本样式
  1. UITableViewCellStyleDefault

左边一个显示图片的imageView,一个标题textLabel,没有detailTextLabel。

  1. UITableViewCellStyleSubtitle

左边一个显示图片的imageView,上边一个主标题textLabel,一个副标题detailTextLabel。主标题字体大且加黑,副标题字体小在主标题下边。

  1. UITableViewCellStyleValue1

左边一个显示图片的imageView,左边一个主标题textLabel,右边一个副标题detailTextLabel,主标题字体比较黑。

  1. UITableViewCellStyleValue2

左边一个主标题textLabel字体偏小,挨着右边一个副标题detailTextLabel,字体大且加黑。

  1. 自定义样式

编写UITableViewCell类的子类,再定义需要的子视图

表视图项目的APPDelegate.m
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

ViewController *vc = [[ViewController alloc] init];

self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:vc];

[self.window makeKeyAndVisible];
UISearchController
  1. 变量属性
NSArray *data;
NSArary *dataBackup;
NSArray *header;
UISearchBar *bar;
UISearchController *searchCon;
  1. viewDidLoad增加几行
dataBackup = data;
searchCon = [[UISearchController alloc] initWithSearchResultsController:nil];
bar = searchCon.searchBar;
[bar sizeToFit];
searcherCon.searchResultsUpdater = self;
self.tableView.tableHeaderView = bar;
  1. 搜索事件响应方法实现
NSMutableArray *array = [NSMutableArray new];
for ( NSArray *arr in dataBackup )
{
	for ( NSString *name in arr )
	{
		if ( [bar.text isEqualToString:@""] || [name containsString:bar.text] )
		{
			[array addObject:name];
		}
	}
}
data = array;
if ( !searchCon.isActive )
{
	data = dataBackup;
}
[self.tableView reloadData];
判断是否在搜索状态
if ( searchCon.isActive )
{
	return(1);
}else{
	return(data.count);
}
实现删除
[tableView deleteRowAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationTop];
增加单元格

static NSstring *reuse=@“cells”; 存放单元格的池子

static NSstring *reuse	= @"cells";
UITableViewcell *cell	= [tableView requeueReusableCellWithldentifier:reuse];

if ( cell = nil )
{
	cell = [UITableViewCell alloc] initWithStyle : UITableViewCellStyleDefault reuseIdentifier : reuse];
}
if ( searchCon.isActive )
{
	cell.textLabel.text = data [indexPath.row];
}else{
	if ( indexPath.row < [data [indexPath.section] count] )
	{
		cell.textLabel.text = data[indexPath.section] [indexPath.row];
	}else                                                                 {
		cell.textLabel.text = @"添加";
	}
}
Model类

新建Cocoa Touch Class类文件 note 的父类应该为NSObject

顺便增加一个协议

@interface ViewController:UITableViewController <UITextViewDalegate>

textViewDidEndEditing方法判断是否编辑完成

沙盒机制

相当于一个文件系统监狱,APP被限制在这个监狱中,对监狱外的事物也就是文件一无所知。


沙盒中含有3个文件夹:
Document、Library、tmp

其中:

NSArray * NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearchPathDomainMask domainMask,BOOL expandTilde);

返回的是数组,选第一个作为主路径


写入数组
[array writeToFile:path atomically:YES];

sqlite3数据库

使用的话,需加入libsqlite3.tbd的库
并引入SQLite头文件
#import <sqlite3.h>
sqlite3接口函数:
1.sqlite3_open()
2.sqlite3_close()
3.sqlite3_exec()

手势识别器
抽三个
  1. UITapGestureRecognizer
    (轻拍手势识别器)

  2. UILongPressGestureRecognizer
    长按手势识别器)

  3. UIPinchGestureRecognizer
    捏拉缩放手势识别器)

  4. UIRotationGestureRecognizer
    旋转手势识别器)

  5. UIPan=GestureRecognizer
    拖曳手势识别器)(关注一下:滑动类手势)

Taps 和 Touches 默认都是1
意思是1个手指,轻拍一次,

Taps代表连续轻拍的次数
Touches代表用几个手指轻拍

UIView有个属性

userInteractionEnable 默认为NO:
不接受用户交互,需要设置为YES
才能响应手势识别操作

图片放在Assets.xcassets中
像素比例

1x 2x 3x 这种为像素比例x越大,就越来越小,

UIGestureRecognizerStateChanged用来写代码的。
模拟器操作手势,按住option键,单击鼠标不放,即可
Scale为捏拉缩放的比例,velocity为捏拉过程的速度。
解决手势冲突设置代理:UIgestureRecognizerDelegate

实现 should RecognizerSimultaneouslyWithGestureRecognizer

translation 表示位移,单位是CGPoint
teanslationInView 是指定相对哪一个?(父容器)的位移

猜你喜欢

转载自blog.csdn.net/weixin_41367523/article/details/93621257