代码中设置UIView

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //修改颜色
    self.view.backgroundColor=UIColor.blueColor;
    
    
    NSLog(@"======>viewDidLoad");
    // Do any additional setup after loading the view.
}
@end

从storybooard中可以知道viewcontroller默认会装载一个view 也就是这里的self.view

ios怎么加载proto文件_ios怎么加载proto文件

我们通过控制view的属性backgroundcolor 设置为蓝色,效果如下

ios怎么加载proto文件_控件_02

UiView的属性
bounds属性:以自己左上角坐标原点定义控件所在矩形的位置和尺寸,它可以实现控件大小的定义

frame属性:以父控件的左上角为坐标原点定义控件的中点位置,他可以实现控件位置的定义

tag属性:可以定义控件的标识,它既可以定义控件的位置,也可以定义控件的大小

center属性:可以定义控件的中心点

 

例子如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    
    //修改颜色
    self.view.backgroundColor=UIColor.systemYellowColor;
    
    
    //动态创建一个view
    UIView *myView=[[UIView alloc] init];
    [self.view addSubview:myView];
    myView.frame=CGRectMake(100,100, 100, 100);
    myView.backgroundColor=UIColor.blackColor;
    
    UIView *myView2=UIView.alloc.init;
    [self.view addSubview:myView2];
    myView2.frame=CGRectMake(200,200,100,100);
    myView2.backgroundColor=UIColor.greenColor;
    myView2.center=self.view.center;
    
    UIView *myView3= [self.view viewWithTag:101];
    myView3.backgroundColor=UIColor.systemGreenColor;
    
    NSLog(@"======>viewDidLoad");
    // Do any additional setup after loading the view.
}

ios怎么加载proto文件_#import_03

可以看到viewwithtag可以查询到对应的view跟android findviewbyid异曲同工,但是ta只能是nsinteger类型,所以ios有iboutlet 可以以自定义字符命名来搭桥是实现findviewbyid(名字)

方式打开storyborad 

ios怎么加载proto文件_控件_04

然后control 按住一个控件 拖动到到分栏代码的viewtrolle下面去 编辑器会自动弹出命名

ios怎么加载proto文件_数据源_05

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *ibview3;

@end

会建立这个一个属性

我们可以通过这个属性(就是storyboard中的刚才拖动的组件)来控制建立关系的组件

如:   _ibview3.backgroundColor=UIColor.redColor;

ios怎么加载proto文件_数据源_06

IBAction 意思就是动作监听类似 Android OnClickListener

链接动作跟IBoutlet一致 control+拖动 注意:只有部分组件才能有效果(应该是能点击的控件)

ios怎么加载proto文件_ios_07

uilabel 组件 用于文本显示

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    UILabel *nameLabel=[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 200, 100)];
    nameLabel.text=@"hello my name is\n 炫神";
    //设置多行显示
    nameLabel.numberOfLines=0;
    //设置文字颜色
    nameLabel.textColor=UIColor.blueColor;
    //设置字体大小
    nameLabel.font=[UIFont systemFontOfSize:30];
    [self.view addSubview:nameLabel];
}

uitextfield 输入框组件

ios怎么加载proto文件_ios_08

绑定uitextfield事件

ios怎么加载proto文件_#import_09

ios怎么加载proto文件_数据源_10

- (IBAction)textchange:(UITextField *)sender {
    UITextField *tf=sender;
    NSLog(@"===========>%@",tf.text);
}

这样我们输入框的文字都会实时调用这个方法

当软键盘弹出来的时候 我们发现点击空白区域并不能关闭软键盘 这样不利于交互,可以在系统touch函数上做关闭

/**
 空白区域的点击方法
 */
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
    // 让整个view 去除编辑 也就是关闭软键盘
    [self.view endEditing:false];
    
    //或者  resign 是辞职释放的意 resignFirstResponder  意思是释放第一响应  其实就是关闭软键盘
   // [self.mytf resignFirstResponder];
}

UItextView

支持滚动 支持输入 支持多行

ios怎么加载proto文件_#import_11

UIButton 按钮

按钮分为很多状态

ios怎么加载proto文件_ios怎么加载proto文件_12

 

我们可以分别对不同状态设置文本图标

ios怎么加载proto文件_ios怎么加载proto文件_13

 

ios怎么加载proto文件_ios怎么加载proto文件_14

运行效果就是点击一下 图标和按钮都有切换的状态

UIImage 图片组件

1. 通过名字获取image [UIImage imageNamed:@"名字"] 可以获取到一个UIimage对象

UIImage *img=[UIImage imageNamed:@"zhengshuang.jpeg"];
    UIImageView *iv=[[UIImageView alloc] init];
    iv.frame=CGRectMake(0, 0, 100, 100);
    iv.backgroundColor=[UIColor yellowColor];
    iv.image=img;
    [self.view addSubview:iv];

ios怎么加载proto文件_#import_15

 

UIswitch 开关切换按钮
 

#import "ViewController.h"

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *sexLabel;
@property (weak, nonatomic) IBOutlet UIImageView *sexImageVIEW;
- (IBAction)sexSwitchChange:(id)sender;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}


- (IBAction)sexSwitchChange:(id)sender {
    UISwitch *sexSwitch=(UISwitch *)sender;
   if(sexSwitch.isOn){
       self.sexLabel.text=@"选中了";
       self.sexImageVIEW.image=[UIImage imageNamed:@"ic_menu_mine_select.png"];
   }else{
       self.sexLabel.text=@"未选中";
       self.sexImageVIEW.image=[UIImage imageNamed:@"ic_menu_mine.png"];
   }
    
}
@end

ios怎么加载proto文件_ios怎么加载proto文件_16

ios怎么加载proto文件_数据源_17

 

UISlider 滑块组件

ios怎么加载proto文件_数据源_18

UIStepper 步进控件。在商城下单数量这个地方很常用

ios怎么加载proto文件_ios怎么加载proto文件_19

 

UISegmentControl 选项卡组件 切换的时候可以监听 效果等同于单选按钮 只不过样式是这种

ios怎么加载proto文件_数据源_20

UIActivityIndicatorView  loading组件 用于渲染加载中的组件

ios怎么加载proto文件_数据源_21

UIScrollView 滚动控件 这个组件比较常用

常用的3个属性:contentSize:滚动内容的大小

contentoffset:显示偏移量

contentinset:设置内容的边距

ios怎么加载proto文件_ios_22

ios怎么加载proto文件_#import_23

ios 实现页面间跳转
 

#import "ViewController.h"
#import "SecondViewController.h"

@interface ViewController ()
@property(nonatomic,strong)UIButton *btn;
@property(nonatomic,strong) UITextField *tf;
@end

@implementation ViewController

-(UIButton *)btn{
    if(_btn==NULL)
    {
        _btn=[[UIButton alloc] initWithFrame:CGRectMake(16, 100, 100, 40)];
        [_btn setTitle:@"跳转" forState:UIControlStateNormal];
        _btn.backgroundColor=[UIColor blueColor];
        [_btn addTarget:self action:@selector(btnClick) forControlEvents:UIControlEventTouchUpInside];
    }
    return _btn;
}
- (void)btnClick{
    //跳转到下一个页面
    SecondViewController *nextPage= [[SecondViewController alloc] init];
    [self presentViewController:nextPage animated:NO completion:nil];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view addSubview:self.btn];
}


@end

ios 页面间传值
页面传值方式有
1.属性传值

2.单例传值

3.NSUserDefaults传值

4.代理传值

5.block传值

7. 通知传值

属性传值的意思 就是构建viewcontroller对象对的时候 将其中某些属性直接赋值 然后再压栈打开这个viewcontroller新页面

列表性控件 UITableView

UITableView 需要一个数据源(datasource)来显示数据

UITableView 会向数据源查询一共有多少航数据以及每一行显示什么数据

没有设置数据源的UITableView 只是一个空壳
凡是遵守UITableViewDataSource协议的OC对象,都可以是UITableView的数据源

 

storyBoard 和viewcontroller关联
1. 让veiwController直接实现<UITableViewDataSource> 数据源接口
2. 在storyBorad中control+拖动到

ios怎么加载proto文件_ios_24

 

ios怎么加载proto文件_数据源_25

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource>

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UITableViewCell *cell=[[UITableViewCell alloc] init];
    cell.textLabel.text=[NSString stringWithFormat:@"xxxxx:%d",indexPath.row];
    cell.textLabel.textColor=UIColor.redColor;
    return cell;
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 10;
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}

@end

 

ios怎么加载proto文件_数据源_26

UITableView 属性

ios怎么加载proto文件_控件_27

ios怎么加载proto文件_#import_28

ios怎么加载proto文件_数据源_29

UITableViewCell的contentVIew

contentView默认有3个子视图

其中两个是uilabel(通过uitableViewCell的textlabel和detailTextLabel属性访问)

第三个是UIImageVIew(通过UITableViewCell的imageView属性访问)

UITableViewCell还有一个UITableVIewCellStyle属性 用于决定使用contentView的哪些子视图 以及这些子视图在contentView中的位置

ios怎么加载proto文件_ios怎么加载proto文件_30

basic 风格

ios怎么加载proto文件_ios_31

 

subtitke风格:

ios怎么加载proto文件_#import_32

rightDetails风格

ios怎么加载proto文件_数据源_33

leftDetail风格:

ios怎么加载proto文件_控件_34

 

UITableView 重用原理
是通过reuseIdentifier 标识来查找重用对象的

UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"abc"];
    if(cell==nil){
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"abc"];
    }

UITableView 数组作为数据源

#import "ViewController.h"

@interface ViewController ()<UITableViewDataSource>
@property(nonatomic,strong)NSArray *datas;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    _datas=@[
        @"三星",@"华为",@"苹果",@"小米",@"OPPO",@"Vivo",@"LG",@"联想",@"酷派",@"索尼",@"洛基亚",@"朵唯",@"红米",@"荣耀"];
}
- (nonnull UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"abc"];
    if(cell==nil){
        cell=[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"abc"];
    }
    //从对象池中查找
    NSLog(@"=====>obj  %ld :%p",(long)indexPath.row,cell);
    cell.textLabel.text=self.datas[indexPath.row];
    cell.textLabel.textColor=UIColor.redColor;
    

    cell.detailTextLabel.text=@"HELLO";
    cell.detailTextLabel.textColor=UIColor.redColor;
    
    
    cell.imageView.image=[UIImage imageNamed:@"filetype_default.png"];
    return cell;
}

- (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.datas.count;
}


@end

UITableView 头部视图和尾部视图

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    return @"头部XX";
}

- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    return @"尾部视图";
}

UITableView 常见的代理方法

 

oc try catch finally 

@try
    {
        @throw [NSException exceptionWithName:@"异常" reason:@"模拟出现异常" userInfo:nil];
    }
    @catch(NSException *error)
    {
        NSLog(@"出现异常");
    }
    @finally{
        NSLog(@"最终执行");
    }

Object c  常见字符串处理

NSString *str=@"我是中国人 我热爱中国";
    NSRange range=[str rangeOfString:@"中国人"];
    NSLog(@"=========>range:%lu,%lu",(unsigned long)range.location,(unsigned long)range.length);
    
    NSString *fileName=@"热爱.mp3";
    if([fileName hasSuffix:@".mp3"]){
        NSLog(@"=========>这是一个mp3文件");
    }
    
    NSString *url=@"http://www.baidu.com";
    if([url hasPrefix:@"http://"]){
        NSLog(@"这是一个网页");
    }
    
    NSString *subStr=[url substringFromIndex:6];
    NSLog(@"=====>截取字符串:%@",subStr);
    
    NSString *intStr=@"123";
    int value= [intStr intValue];
    NSLog(@"======>字符串转int %d",value);
    
    
    //字符串转大写
    NSString *sayLove=@"i love you";
    NSLog(@"=====>转换大写:%@",[sayLove uppercaseString]);
    
    NSString *sayLoveUpper=[sayLove uppercaseString];
    NSLog(@"=====>转换成小写:%@",[sayLoveUpper lowercaseString]);
    
    
    //依次判断unicode顺序
    NSComparisonResult result= [@"abc" compare:@"cde"];
    if(result==NSOrderedAscending)
    {
        NSLog(@"=======> 大于");
    }else if(result ==NSOrderedSame)
    {
        NSLog(@"=======> 等于");
    }else if(result==NSOrderedDescending)
    {
        NSLog(@"=======> 小于");
    }
    
    NSMutableString *mStr=[[NSMutableString alloc] initWithCapacity:20];
    [mStr appendString:@"hello"];
    [mStr appendString:@" world"];
    [mStr insertString:@"你好" atIndex:2];
    [mStr replaceCharactersInRange:NSMakeRange(3, 9) withString:@"替换"];
    NSLog(@"==========>可变字符串:%@",mStr);