01-学前需知
加法计算器代码
//MQViewController.h
/**
IBAction:
1> 能保证方法可以连线
2> 相当于void,没有返回值
IBOutlet:
1> 能保证属性可以连线
*/
#import <UIKit/UIKit.h>
@interface MQViewController : UIViewController
@end
//MQViewController.m
#import "MQViewController.h"
// 类扩展,对类做私有扩展,但是和头文件有区别,在这声明的变量是私有的,别人不能访问,这样做的好处是将内部实现的方法保护起来,不要让外界知道;Xcode5建议所有的连线放到这个interface里面,不要放在.h文件中,保证封装性
@interface MQViewController ()
// 点击了计算按钮的时候就调用
- (IBAction)compute;
//属性代表成员变量
// num1用来控制第一个文本框
@property (nonatomic, weak) IBOutlet UITextField *num1;
// num2用来控制第二个文本框
@property (nonatomic, weak) IBOutlet UITextField *num2;
// sumLabel用来控制最右边的文本标签
@property (nonatomic, weak) IBOutlet UILabel *sumLabel;
@end
@implementation MQViewController
-(void)compute
{
// 1.取得文本输入框的值
NSString *text1 = _num1.text;
// 等于 NSString *text1 = self.num1.text;
NSString *text2 = self.num2.text;
// 2.相加
int sum = text1.intValue + text2.intValue;
// 3.将结果显示到最右边的文本标签上
self.sumLabel.text = [NSString stringWithFormat:@"%d", sum];
// 4.退出键盘
// 谁把键盘叫出来就把键盘退出
// 响应者
// 第一响应者:叫出键盘的那个控件
// 不当第一响应者(就会把键盘退下)
// [self.num1 resignFirstResponder]; //左边文本框键盘退下
// [self.num2 resignFirstResponder]; //右边文本框键盘退下
// 等价于ViewControl的View结束编辑,上面缺点是多个文本框都要退出键盘
// 这种做法有前提,前提是self.view内部的控件调出键盘的
[self.view endEditing:YES];
}
@end
02-加法计算器01-搭建UI界面监听按钮点击
1)iOS没有Java中的包名和命名空间的概念,为了区分不同人写的同名的类,它采用了类名前缀来去区分。
2)程序一运行会加载解析Main.storyborad,检测箭头指向哪个控制器(箭头意味着程序的入口),创建箭头所指向View的控制器,再由控制器创建所指向的UIView,再创建UIView里面的子空间,最后显示在用户眼前,这是软件的显示过程。
结论:
1)先有ViewController,再有View;
2)由ViewController监听View里的一切事件;
3)当一个方法要进行连线的时候必须以IBAction开头(返回IBAction属性);
03-加法计算器02-计算文本框的和
监听事件声明一个方法;
当要改变控件的状态、属性时,声明一个属性来改变这个控件。
04-常见控件预览
Bundle Identifier:app的唯一标识,能在手机中区别不同软件
A:cn.itcast.abc
B:cn.itcast.abc
先装A再装B,B会把A软件覆盖
为了保证不同公司的同名app都可以存在,规定Bundle Identifier要和公司有关(即Company Identifier)。
Company Identifier:公司的唯一标识,一般是公司域名的倒写。
Google地图:cn.google.map
360地图: cn.360.map
Bundle Identifier不支持中文,若项目名是01-哈哈哈哈哈和01-加法计算器都是一样的,cn.itcast.-1-----
常见错误:
把ViewController内的属性误删,stroyboard内的连线还在,会导致编译时错误说调用那个属性的语句找不到那个属性,如果不调用误删属性,程序编译不报错,storyboard的那个属性连线还在,但运行时报错,setValue:forUndefinedKey:]: this class is not key value coding,表示连线出问题,控制器右击有感叹号的是有问题的连线,凡是连线有问题的都会报这个错;
XCode5建议我们把所有属性放在.m文件中,不需要向外界暴露你有哪些属性。
Xcode5建议所有的连线放到.m文件的@interfaceMQViewController ()里面,不要放在.h文件中,保证封装性
05-控件的常见属性
storyboard后添加的控件的view名称的最后面,显示在最上层。
06-按钮的基本使用01-移动和缩放
autolayout:自动布局会干扰代码
按钮控制改进前代码
//MQViewController.m
#import "MQViewController.h"
@interface MQViewController ()
- (IBAction)up; // 上
- (IBAction)down; // 下
- (IBAction)left; // 左
- (IBAction)right; // 右
- (IBAction)big; // 放大
- (IBAction)small; // 缩小
//头像
@property (nonatomic,weak) IBOutlet UIButton *head;
@end
@implementation MQViewController
#pragma mark 向上走
- (IBAction)up
{
// OC不允许直接修改 对象的 结构体属性的 成员
// 允许直接修改 对象的 结构体属性
// 获取值 -> 修改值 -> 赋给值
CGRect tempFrame = self.head.frame;
tempFrame.origin.y -= 10;
self.head.frame = tempFrame;
}
#pragma mark 向下走
- (IBAction)down
{
CGRect tempFrame = self.head.frame;
tempFrame.origin.y += 10;
self.head.frame = tempFrame;
}
#pragma mark 向左走
- (IBAction)left
{
CGRect tempFrame = self.head.frame;
tempFrame.origin.x -= 10;
self.head.frame = tempFrame;
}
#pragma mark 向右走
- (IBAction)right
{
CGRect tempFrame = self.head.frame;
tempFrame.origin.x += 10;
self.head.frame = tempFrame;
}
#pragma mark 放大
- (IBAction)big
{
// 1.取出原来属性
CGRect tempFrame = self.head.frame;
// 2.改变临时属性,需要去掉autolayout
tempFrame.size.width += 20;
tempFrame.size.height += 20;
// 3.用临时属性覆盖原来的属性
self.head.frame = tempFrame;
}
#pragma mark 缩小
- (IBAction)small
{
CGRect tempFrame = self.head.frame;
tempFrame.size.width -= 20;
tempFrame.size.height -= 20;
self.head.frame = tempFrame;
}
@end
经典错误:
-[MJViewContro;;er up]:unrecognizedselector sent to instance 0x8c50af0
某个对象没有实现某个方法,误删方法