iOS是由苹果开发的移动操作系统。
MAC OS
Mac OS + xcode。
Command + R = 运行
Command + N = 新建
Xcode安装好后,就默认安装了iOS 模拟器,可以方便地运行自己开发的App。值得一提的是,与一般人对模拟器的印象不同iOs模拟器的运行速度非常快,有时候甚至比真机还快,-点都不卡,启动速度也很快,使用起来令人感觉愉快
Main storyboard(拖控件)
launchscreen (纯代码)
默认为(main storyboard)
AppDelegate (处理应用程序生命周期的各个事件响应)
ViewController(视图控制器)
rootViewController (根视图控制器),没有设置背景默认为黑色
UILabel *label = [UILabel new ]
UILabel *label =[[UILabel alloc] init]
有个概念叫异步执行 与之 相对的是同步执行。同步执行就是一 步步按部就班的执行,当前任务为未完成,则当前线程陷入阻塞状态,直到任务完成才运行下一个任务。而异步执行则灵活得多,指定一个任务运行后,不管任务有没有完成,马上就返回执行下一个任务。之前的任务完成后,框架会自动调用写好的回调函数来处理善后。
(1)视图加载完毕
(2)视图将显示
(3)视图已显示
(4)视图将消失
(5)视图已消失
协议与代理是Objective C语言的概念,与其他的语言的名词差别很大。协议可以看作Java等语言中的接口,或者抽象类即只有方法定义,却不实现方法。
代理是实现了协议的对象,可以看作Java等语言中实现了某接口或抽象类的对象。
协议 == 接口 || 抽象类
代理 == 接口的实现类 || 抽象类实现类
target : 用来指定事件由某个对象处理
selector:用来指定某个方法作为执行响应事件
有些事件不是由硬件中断产生。比如键盘收起事件等。。。。这些事件一般通过Cocoa的通知中心机制来广播。
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是所有控件的父类,所谓控件就是能够接受用户的触摸操作,并对其做出响应的UI组件
按钮、开关、分段控件、进度条等
(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];
通过UISegmentefControl对象的selectedSegmentIndex属性得知当前所选的index,从而做出响应。
为了控制其输入过程中的诸多事件,实现UITextFieldDelegate协议
用的比较多的是textFieldDidEditing方
法,用于在用户结束编辑时的处理工作。
用于展示大段文本(多行)
有一个BOOL类型属性editable来控制是否可编辑
添加 tv控件 到父视图上
[self.view addSubview:tv];
(1)UIDatePickerModeTime --仅显示和选择时|分
(2)UIDatePickerModeDate --仅显示和选择 年|月|日 》》》》 重点关注
(3)UIDatePickerModeDateAndTime --仅显示和选择年|月|日|时|分等
(4)UIdateModeCountDownTimer 用以计时,选择小时数和分钟数: 小时|分钟
常用的用法如:
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 的代理有两个与其对应的协议
(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];
}
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];//按钮组加入工具栏
_windows.rootViewController = nav;
导航控制器的本质:
(1)维护了一个控制器的栈
(2)栈结构是先进后出的结构
(3)栈的好处,在于可以记忆最近做的事
(4)新切入一个页面时,栈会新压入一个控制器
(5)退出当前页面时,栈也相应地弹出当前控制器
常用属性:
navigationItem 用来定义顶部导航栏的标题与左右侧按钮、图片的
navigationController 可直接访问导航控制器本身(比如推入新页面或退出当前页)
去掉 Use Auto Layout 和 Use Size Classes 就可以往界面添加按钮(真的这样??)
需用到identifier 加载UIviewController对象
Navigation Controller带有2个界面,左边是NavigationController,右边是 root view controller
Modal 连线中间设置一个segue 也就是跳转
非 navigation controller 不能选择Push跳转, 但可以选Modal
警告框是一个模态对话框(modal dialog)会暂时中断其他操作。
iOS8以前是有专门的视图类,不过后面被抛弃了
UIAlertController 有两种样式(但它两不是同一种控件)
(1)警告框
(2)操作表
UIAlertActionStyleDestructive 破坏性操作 红色
UIAlertActionStyleDefault 默认项 黑色
用于某些时间较长的操作,如网络获取数据等。。。
左边一个显示图片的imageView,一个标题textLabel,没有detailTextLabel。
左边一个显示图片的imageView,上边一个主标题textLabel,一个副标题detailTextLabel。主标题字体大且加黑,副标题字体小在主标题下边。
左边一个显示图片的imageView,左边一个主标题textLabel,右边一个副标题detailTextLabel,主标题字体比较黑。
左边一个主标题textLabel字体偏小,挨着右边一个副标题detailTextLabel,字体大且加黑。
编写UITableViewCell类的子类,再定义需要的子视图
self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
ViewController *vc = [[ViewController alloc] init];
self.window.rootViewController = [[UINavigationController alloc] initWithRootViewController:vc];
[self.window makeKeyAndVisible];
NSArray *data;
NSArary *dataBackup;
NSArray *header;
UISearchBar *bar;
UISearchController *searchCon;
dataBackup = data;
searchCon = [[UISearchController alloc] initWithSearchResultsController:nil];
bar = searchCon.searchBar;
[bar sizeToFit];
searcherCon.searchResultsUpdater = self;
self.tableView.tableHeaderView = bar;
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 = @"添加";
}
}
新建Cocoa Touch Class类文件 note 的父类应该为NSObject
顺便增加一个协议
@interface ViewController:UITableViewController
textViewDidEndEditing方法判断是否编辑完成
相当于一个文件系统监狱,APP被限制在这个监狱中,对监狱外的事物也就是文件一无所知。
沙盒中含有3个文件夹:
Document、Library、tmp
其中:
NSArray * NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory directory,NSSearchPathDomainMask domainMask,BOOL expandTilde);
返回的是数组,选第一个作为主路径
写入数组
[array writeToFile:path atomically:YES];
使用的话,需加入libsqlite3.tbd的库
并引入SQLite头文件
#import
sqlite3接口函数:
1.sqlite3_open()
2.sqlite3_close()
3.sqlite3_exec()
抽三个
UITapGestureRecognizer
(轻拍手势识别器)
UILongPressGestureRecognizer
(长按手势识别器)
UIPinchGestureRecognizer
(捏拉缩放手势识别器)
UIRotationGestureRecognizer
(旋转手势识别器)
UIPan=GestureRecognizer
(拖曳手势识别器)(关注一下:滑动类手势)
Taps 和 Touches 默认都是1
意思是1个手指,轻拍一次,
Taps代表连续轻拍的次数
Touches代表用几个手指轻拍
userInteractionEnable 默认为NO:
不接受用户交互,需要设置为YES
才能响应手势识别操作
1x 2x 3x 这种为像素比例x越大,就越来越小,
实现 should RecognizerSimultaneouslyWithGestureRecognizer