UI控件与视图层次:探索界面的无限可能

[OC]UI学习笔记

文章目录

  • [OC]UI学习笔记
    • 视图和视图层次结构
      • CGRect
      • UILabel
      • UIButton
      • UIView控件
      • UIView的层级关系
      • UIWindow
      • 定时器和视图移动
      • UISwitch
      • 进度条和滑动条控件
      • 步进器和分栏控件
      • 警告对话框与等待指示器
      • UITextField

视图和视图层次结构

Objective-C中的UI编程主要围绕视图(View)和视图层次结构展开。视图是通过UIKit框架提供的,它是用户界面的基本构建块,它们用于显示内容、响应用户交互等。

CGRect

CGRect是一个用于表示矩形的结构体,它由原点(origin)和尺寸(size)组成。其中原点(origin)也是一个结构体,包含坐标(CGFloat x, CGFloat y)。

对于CGRect来说,我们一般使用CGRectMake来进行CGRect的创建,其方法完整签名如下:

 CGRect CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height);
  • x:矩形的原点的x坐标。
  • y:矩形的原点的y坐标。
  • width:矩形的宽度。
  • height:矩形的高度。

例如,以下代码创建了一个原点位于(50, 100),宽度为200,高度为300的矩形:

CGRect rect = CGRectMake(50, 100, 200, 300);

CGRect结构在UIKit框架中广泛使用,用于定义视图的位置和尺寸。通过使用CGRectMake函数,我们可以方便地创建和配置矩形。

UILabel

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)createLabel {
    UILabel *l = [[UILabel alloc] init];
    l.frame = CGRectMake(100, 100, 160, 40);
    l.text = @"hello,world";
    
    //设置lable背景颜色
    l.backgroundColor = [UIColor redColor];
    //设置整体背景颜色
    self.view.backgroundColor = [UIColor blueColor];
    //设置字体大小, 默认为18
    l.font = [UIFont systemFontOfSize:24];
    
    //label高级选项
    //阴影设置
    l.shadowOffset = CGSizeMake(3, 3);//偏移量
    l.shadowColor = [UIColor grayColor];//颜色
    //对齐方式,默认左对齐
    l.textAlignment = NSTextAlignmentCenter; //设置居中
    //设置label文字显示的行数,如果此参数为0,则会根据字数自动分配行数。
    l.numberOfLines = 0;
    
    
    //添加到视图当中
    [self.view addSubview: l];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建UILabel
    [self createLabel];
}

@end

UIButton

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
- (void)createButton {
    UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeCustom];
    btn1.frame = CGRectMake(100, 100, 160, 40);
    btn2.frame = CGRectMake(100, 300, 160, 120);
    //按钮的标记值,用于区分按钮
    btn1.tag = 1;
    btn2.tag = 2;
    //使用图片作为按钮
    UIImage *i1 = [UIImage imageNamed:@"coverImg_auto_20245920537.png"];
    UIImage *i2 = [UIImage imageNamed:@"example_image.jpg"];
    [btn2 setImage:i1 forState:UIControlStateNormal];
    [btn2 setImage:i2 forState:UIControlStateHighlighted];
    [btn2 addTarget:self action:@selector(touchImage) forControlEvents:UIControlEventTouchUpInside];
    
    //参数1:显示在按钮上的文字,参数2:设置显示参数1时的状态
    [btn1 setTitle:@"按钮1" forState:UIControlStateNormal];//UIControlStateNormal——正常状态
    [btn1 setTitle:@"按下" forState:UIControlStateHighlighted];//UIControlStateHighlighted——被按下
    /* 
     参数1: 调用函数的对象
     参数2: 函数,当程序满足参数3的事件类型,则执行该房啊发
     参数3: 事件处理的函数类型
     UIControlEventTouchUpInside——按下按钮弹回时,且鼠标还在按钮范围上时
     UIControlEventTouchUpOutside——按下按钮弹回时,且鼠标不在按钮范围上时
     */
    [btn1 addTarget:self action:@selector(pressBtn:) forControlEvents:UIControlEventTouchUpInside];
    //设置背景
    btn1.backgroundColor = [UIColor grayColor];
    //字体颜色
    [btn1 setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
    //字体大小
    btn1.titleLabel.font = [UIFont systemFontOfSize:12];
    
    [self.view addSubview:btn1];
    [self.view addSubview:btn2];
}
-(void)pressBtn: (UIButton*) btn {
    NSLog(@"%lu被按下",btn.tag);
}
-(void)touchImage {
    NSLog(@"你摸了摸小鹿");
}
- (void)viewDidLoad {
    [super viewDidLoad];
    // 创建UILabel
    [self createButton];
}

@end

UIView控件

UIView是iOS的绘图对象,是所有显示在屏幕上对象的基础类,它是是一个矩形对象,有背景颜色,层级关系。

下面展示了如何创建一个基本的UIView,并添加到视图控制器之中

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建一个视图
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    view.backgroundColor = [UIColor redColor];
    
    //将新建的子视图添加到父视图当中
    //1.将加入的视图添加到屏幕上
    //2.将视图作为父视图的子视图进行管理
    [self.view addSubview:view];
    
    //隐藏选项,默认为NO,即不做渲染
    view.hidden = NO;
    
    //设置透明度
    view.alpha = 0.5;//1为透明,0为不透明,0.5则为半透明
    
    //是否显示不透明
    view.opaque = NO;
    
    //从父视图的管理删除,不显示在屏幕之中
    [view removeFromSuperview];
}

@end

view.opaque属性设置为YES时(也是该属性的默认值),表示该视图是不透明的。这意味着视图的背景色会完全覆盖其后面的任何内容,包括其他视图或父视图中的内容。当view.opaque属性设置为NO时,表示该视图是透明的。这意味着视图的背景色只会影响视图本身的可见区域,而不会遮挡其后面的内容。

UIView的层级关系

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 创建一个视图
    UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(50, 100, 200, 200)];
    view1.backgroundColor = [UIColor redColor];
    
    UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(75, 125, 200, 200)];
    view2.backgroundColor = [UIColor blueColor];
    
    UIView *view3 = [[UIView alloc] initWithFrame:CGRectMake(100, 150, 200, 200)];
    view3.backgroundColor = [UIColor greenColor];
    
    //哪一个视图先被添加到fushitu中,就默认先绘制哪一个子视图
    [self.view addSubview:view1];
    [self.view addSubview:view2];
    [self.view addSubview:view3];
    
    //将view3视图到最前面
    [self.view bringSubviewToFront:view3];
    //将view2视图调整到最后面
    [self.view sendSubviewToBack:view2];
    
    //subviews为view.self管理所有子窗口的数组,在最前面显示的在数组的最后,相反在最后面的则在数组的第一位
    UIView *front =  self.view.subviews[2];
    NSLog(@"%d",(front == view3));
    UIView *back = self.view.subviews[0];
    NSLog(@"%d",(back == view2));
}

@end

每个子视图的父视图有且仅有一个,我们可以使用view.superview来指代

UIWindow

UIWindow是一个特殊的UIView,它代表了应用程序的窗口,在整个程序之中有且只有一个UIWindow对象。你可以将它看作是应用程序的大窗户,用来展示应用的界面给用户看。

UIWindow的主要作用就是显示应用程序的界面。它是应用程序中所有视图的容器,相当于一个大的画布,用来放置按钮、文本、图像以及其他用户界面元素。

另外,UIWindow还管理了应用程序的视图控制器层次结构。视图控制器是用来管理和控制视图的对象,UIWindow负责将视图控制器的内容显示在屏幕上,并确保用户可以与之交互。

除了显示界面,UIWindow还承担了处理用户触摸和其他事件的任务。当用户点击屏幕或进行其他操作时,UIWindow会接收这些事件并将它们传递给正确的视图或视图控制器,以便应用程序可以做出相应的反应。

由于版本的更新,UIWindow被写在了SceneDelegate.m之中,且UIWindow`已经在程序自动给出,无需我们手动实现,

#import "SceneDelegate.h"

@interface SceneDelegate ()

@end

@implementation SceneDelegate


- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    //首先是对UIWindow对象创建视图控制器
    self.window.rootViewController = [[UIViewController alloc] init];
    //对UIWindow设置背景颜色
    self.window.backgroundColor = [UIColor orangeColor];
    //可以直接给window上添加视图
    UIView *view1 = [[UIView alloc] initWithFrame: CGRectMake(100, 100, 100, 50)];
    view1.backgroundColor = [UIColor blackColor];
    //当创建一个新的背景视图,然后将这个视图作为window的子视图,再让view1作为背景视图的子视图,就会有一个层级关系
    //当移动背景视图的时候,view1视图也会随着移动,子视图是参照父视图的坐标系
    UIView *backView = [[UIView alloc] initWithFrame: CGRectMake(100, 300, 200, 200)];
    backView.backgroundColor = [UIColor redColor];
    [backView addSubview: view1];
    //将view1视图添加到window上
    [self.window addSubview: backView];
 
    //打印不同视图的window属性:
    NSLog(@"%@", view1.window);
    NSLog(@"%@", backView.window);
    NSLog(@"%@", self.window);
    //可以看出,它们三个的window属性是同一个window
 
    //使window有效并显示在屏幕上
    [self.window makeKeyAndVisible];

}
//后面的方法省略。。。

image-20240522205040766

ViewController.h之中的viewDidLoad只在第一次加载显示视图的时候被调用,用于布局初始化视图。

实现视图切换

#import "JCViewViewController.h"

@interface JCViewViewController ()

@end

@implementation JCViewViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
}

//当屏幕被点击时,调用该函数
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    /*
     使得当前的控制器消失
     参数1:使用切换动画效果
     参数2:切换介绍后功能调用(block操作),不需要则传入nil
     */
    [self dismissViewControllerAnimated:YES completion:nil];
}
---------------------------------------------------------------------
#import <UIKit/UIKit.h>
#import "JCViewViewController.h"
@interface ViewController : UIViewController

@end

@implementation ViewController


//在第一次加载被使用
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor redColor];
   
}

//当屏幕被点击时,调用该函数
- (void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    JCViewViewController *vc = [[JCViewViewController alloc] init];
    
    
    /*
     显示一个新的视图控制器到屏幕上
     参数1:新的视图控制器对象
     参数2:使用切换动画效果
     参数3:切换介绍后功能调用,不需要则传入nil
     */
    [self presentViewController:vc animated:YES completion:nil];
}


//以下内容在每个视图显示时都会被调用

//当视图控制器的视图即将显示时,就会调用此函数
//视图显示分为:1.显示之前 2. 正在显示 3. 已经被隐藏
//参数:是否用动画切换后消失
-(void)viewWillAppear:(BOOL)animated {
    NSLog(@"即将显示");
}

//当视图显示到屏幕的瞬间调用此函数
//参数:是否用动画切换后消失 状态:已经显示在屏幕之上
-(void)viewDidAppear:(BOOL)animated{
    NSLog(@"正在显示");
}

//当视图控制器的视图即将消失的时候,调用此函数
//参数:表示是否用动画切换后消失
//当前状态:视图还是显示在屏幕上的
- (void) viewWillDisappear:(BOOL)animated {
    NSLog(@"视图即将消失");
}


//当前视图消失之后调用
//参数:是否用动画切换后消失 状态:视图已经消失在屏幕之上
-(void)viewDidDisappear:(BOOL)animated {
    NSLog(@"已经消失");
}
@end

定时器和视图移动

//ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

@property (nonatomic, strong) NSTimer *timer; // 声明计时器实例变量

@end
---------------------------------------------------------------------
//ViewController.m
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

//在第一次加载被使用
- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIButton *btn1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn1.frame = CGRectMake(150, 100, 80, 40);
    [btn1 setTitle:@"计时启动键" forState:UIControlStateNormal];
    [btn1 addTarget:self action:@selector(start) forControlEvents:UIControlEventTouchUpInside];
    
    UIButton *btn2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btn2.frame = CGRectMake(150, 300, 80, 40);
    [btn2 setTitle:@"计时停止键" forState:UIControlStateNormal];
    [btn2 addTarget:self action:@selector(stop) forControlEvents:UIControlEventTouchUpInside];
    
    [self.view addSubview:btn1];
    [self.view addSubview:btn2];
    
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 75, 75)];
    view.backgroundColor = [UIColor greenColor];
    view.tag = 101;
    
    [self.view addSubview:view];
    [self.view sendSubviewToBack:view];
}


//当屏幕被点击时,调用该函数
-(void)start {
    /*
     参数一:调用计时器的间隔,以秒为单位
     参数二:调用函数的对象
     参数三:被调用的事件函数
     参数四:可以传入定时器之中,可以不传
     参数五:是否重复调用定时器操作
     */
    
    [self stop];//防止多个计时器同时开始,无法停止
    _timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(useTimer:) userInfo:@"bb" repeats:YES];
}

//可以传入NSTimer作为参数
-(void) useTimer:(NSTimer*) timer {
    UIView *view = [self.view viewWithTag:101];
    view.opaque = NO;
    view.frame = CGRectMake(view.frame.origin.x + 5, view.frame.origin.y + 5, 75, 75);
    
}

//停止计时器
-(void) stop {
    if (_timer != nil) {
        [_timer invalidate];//invalidate
        _timer = nil;
    }
}
@end

UISwitch

//ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
//定义一个开关控件
//可以进行状态的改变
//两种状态可以转换——开/关

@property (nonatomic, strong) UISwitch *s; // 声明UISwitch实例变量

@end
---------------------------------------------------------------------
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

//在第一次加载被使用
- (void)viewDidLoad {
    [super viewDidLoad];
    
    //继承于UIView
    _s = [[UISwitch alloc] init];
    //UISwitch为苹果官方控件
    //宽高为默认属性,无法改变
    _s.frame = CGRectMake(100, 100, 20, 20);
    
    //两种都为设置开关的状态,YES为开
    [_s setOn:YES];
    _s.on = YES;
    
    //多了一个是否使用动画效果的参数
    [_s setOn:YES animated:YES];
    
    //设置开启状态的风格颜色
    [_s setOnTintColor:[UIColor purpleColor]];
    
    //修改按钮颜色
    [_s setThumbTintColor:[UIColor orangeColor]];
    
    
    //添加事件函数
    [_s addTarget:self action:@selector(click:) forControlEvents:UIControlEventValueChanged];
    [self.view addSubview:_s];
}

-(void)click:(UISwitch*) s {
    //on表示的是点击后的状态
    NSLog(@"按钮被点击");
    if (s.on == YES) {
        NSLog(@"@%按钮被打开",s);
    } else {
        NSLog(@"%@按钮被关闭!", s);
    }
}


@end

进度条和滑动条控件

//ViewController.h
#import <UIKit/UIKit.h>

@interface ViewController : UIViewController

//进度条——一般用来表示下载或者播放视频的进度
@property (nonatomic, strong) UIProgressView *progress; // 声明进度条实例变量

//滑动条——一般用来调整音量
@property (nonatomic, strong) UISlider *slider; // 声明滑动条实例变量
@end
---------------------------------------------------------------------
#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

//在第一次加载被使用
- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self makeProgress];
    [self makeSlider];
}

-(void)makeProgress {
    _progress = [[UIProgressView alloc] init];
    
    //进度条直接继承于UIView,不能主动相应事件

    //进度条宽度不可改变
    _progress.frame = CGRectMake(50, 100, 300, 40);
    //设置颜色,默认蓝色
    _progress.progressTintColor = [UIColor redColor];
    _progress.trackTintColor = [UIColor blackColor];
    
    //设置进度条的进度 —— 范围0~1
    _progress.progress = 0.5;
    
    //设置风格特征
    _progress.progressViewStyle = UIProgressViewStyleDefault;
    
    [self.view addSubview:_progress];
}

-(void)makeSlider {
    _slider = [[UISlider alloc] init];
    
    //slider的宽度同样无法改变
    _slider.frame = CGRectMake(50, 200, 300, 40);
    
    //设置滑动条的最大/小值,可为负值
    _slider.maximumValue = 100;
    _slider.minimumValue = -100;

    //设置滑动条的值,该值为float,值不会超过范围
    _slider.value = 20;
    
    //设置左侧/右侧滑动条的背景颜色
    _slider.minimumTrackTintColor = [UIColor blueColor];
    _slider.maximumTrackTintColor = [UIColor greenColor];
    //设置滑块颜色
    _slider.thumbTintColor = [UIColor redColor];
    
    //滑动条可相应事件函数
    [_slider addTarget:self action:@selector(press) forControlEvents:UIControlEventValueChanged];
    
    [self.view addSubview:_slider];
}

//实现调节滑动条使得进度条随之改变
-(void)press {
    _progress.progress = (_slider.value - _slider.minimumValue) / (_slider.maximumValue - _slider.minimumValue);
    NSLog(@"value = %f", _slider.value);
}
@end

步进器和分栏控件

#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

//在第一次加载被使用
- (void)viewDidLoad {
    [super viewDidLoad];
    [self makeStepper];
    [self makeControl];
}

//步进器——按照一定数字调整数据
-(void)makeStepper {
    UIStepper *stepper = [[UIStepper alloc] initWithFrame:CGRectMake(100, 100, 300, 30)];//宽高固定不变
    
    //设置步进器的范围—— 0~100
    stepper.minimumValue = 0;
    stepper.maximumValue = 100;
    
    //设置初始值,默认为0
    stepper.value = 10;
    
    //设置步进值,默认为1
    stepper.stepValue = 10;
    
    //是否重复响应操作,若为NO即无法进行长按操作,只能点击
    stepper.autorepeat = YES;
    
    //是否将步进结果用事件函数响应,即长按不会给出事件响应
    stepper.continuous = YES;
    
    //添加时间函数
    [stepper addTarget:self action:@selector(useStepper:) forControlEvents:UIControlEventValueChanged];
    
    [self.view addSubview:stepper];
}
//分栏控制器
-(void)makeControl {
    UISegmentedControl* control = [[UISegmentedControl alloc]initWithFrame:CGRectMake(10, 200, 300, 40)];
    
    //添加按钮元素
    [control insertSegmentWithTitle:@"0元" atIndex:0 animated:NO];
    [control insertSegmentWithTitle:@"5元" atIndex:1 animated:NO];
    [control insertSegmentWithTitle:@"10元" atIndex:2 animated:NO];
    
    //默认索引设置
    control.selectedSegmentIndex = 0;
    
    [control addTarget:self action:@selector(click:) forControlEvents:UIControlEventValueChanged];
    
    [self.view addSubview:control];
}

-(void)useStepper:(UIStepper*) stepper{
    NSLog(@"stepper is using %lf",stepper.value);
}

-(void)click: (UISegmentedControl*) control{
    NSLog(@"%ld", (long)control.selectedSegmentIndex);
}
@end

警告对话框与等待指示器


#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface ViewController ()

@end

@implementation ViewController

//在第一次加载被使用
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor blackColor];
    [self makeAlertViewAndActivity];
}

//警告对话框
-(void)makeAlertViewAndActivity {
    for (int i = 0; i < 2; i++) {
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        btn.frame = CGRectMake(150, 100 + i * 100, 100, 40);
        
        if(i == 0) {
            [btn setTitle:@"警告对话框" forState:UIControlStateNormal];
        } else {
            [btn setTitle:@"等待指示器" forState:UIControlStateNormal];
        }
        
        btn.tag = 101 + i;
        
        [btn addTarget:self action:@selector(press:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btn];
    }
    
}

-(void)press:(UIButton*)btn {
    if(btn.tag == 101) {
        NSLog(@"11");
        /*
         参数1️⃣:对话框标题
         参数2️⃣:提示信息
         参数3️⃣:处理按钮事件的代理对象
         参数4️⃣:取消的按钮文字
         */
//        UIAlertView *view = [[UIAlertView alloc] initWithTitle:@"警告!!" message:@"电量不足,请充电" delegate:nil cancelButtonTitle:@"取消" otherButtonTitles:@"OK", nil];
//        //显示对话框
//        [view show];
//UIAlertView在iOS9.0已经被移除,我们使用UIAlertController来实现警告功能;
        
        
        //设置标题
        UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"警告!!" message:@"电量不足,请充电" preferredStyle:UIAlertControllerStyleAlert];
        //设置取消按钮,参数一:标题 参数二:按钮的风格
        UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleCancel handler:nil];

        UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil];

        [alertController addAction:cancelAction];
        [alertController addAction:okAction];

        
        //调用keyWindow方法获取应用程序的主窗口,rootViewController属性获取窗口的根视图控制器
        UIViewController *rootViewController = [[[UIApplication sharedApplication] keyWindow] rootViewController];
        //将controller显示在主界面上
        //参数一:是否动画效果
        //参数二:是否需要进行额外操作
        [rootViewController presentViewController:alertController animated:YES completion:nil];
    } else {
        //创建等待提示器
        NSLog(@"1");
        UIActivityIndicatorView * view1 = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(100, 300, 80, 100)];
        //风格一共有大白,小白,小灰
        view1.activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium;
        
        //启动动画并显示
        [view1 startAnimating];
        
        [self.view addSubview:view1];
    }
}

//UIAlertViewDelegate协议之中的函数,当点击对话框时,调用此函数
//参数1️⃣:对话框本身
//参数2️⃣:按钮的索引
-(void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"%d",buttonIndex);//返回按钮个数
}

-(void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {
    NSLog(@"已经消失");
}

-(void)alertView:(UIAlertView *)alertView willDismissWithButtonIndex:(NSInteger)buttonIndex {
    NSLog(@"将要消失");
}

actionWithTitle:style:handler: 是 UIAlertController 类的方法之一,用于创建一个带有指定标题、风格和处理程序的 UIAlertAction 对象。

参数解析:

  • title:指定操作按钮的标题。
  • style:指定操作按钮的样式,有以下几种可选值:
    • UIAlertActionStyleDefault:默认样式,表示常规操作。
    • UIAlertActionStyleCancel:取消样式,表示取消操作,通常放在警告框的底部。
    • UIAlertActionStyleDestructive:破坏性样式,表示具有破坏性的操作,例如删除操作。
  • handler:指定一个回调处理程序(block),在用户点击操作按钮时执行的代码。可以在这个处理程序中实现相应的操作逻辑。

当用户点击这个取消按钮时,不会执行任何特定的操作,而仅仅是关闭警告框。

一般来说,取消按钮的作用是提供给用户一个取消当前操作的选项,点击取消按钮后,警告框会消失,不执行任何额外操作。

UITextField

//在第一次加载被使用
- (void)viewDidLoad {
    [super viewDidLoad];
    [self makeField];
}
//文本输出区域
//只能输入单行的文字
//继承于UIControl
-(void)makeField {
    _field = [[UITextField alloc] initWithFrame:CGRectMake(100, 100, 200, 50)];
    
    _field.text = @"用户名";
    //字体大小
    _field.font = [UIFont systemFontOfSize:15];
    //字体颜色
    _field.textColor = [UIColor redColor];
    
    //边框风格
    //UITextBorderStyleRoundedRect默认风格
    //UITextBorderStyleNone无边框风格
    //UITextBorderStyleLine边框风格
    //UITextBorderStyleBezel——bezel边框
    _field.borderStyle = UITextBorderStyleRoundedRect;
    
    //设置虚拟键盘格式
    //UIKeyboardTypeDefault默认风格
    //UIKeyboardTypeNamePhonePad字母和数字风格
    //UIKeyboardTypeNumberPad纯数字
    _field.keyboardType = UIKeyboardTypeNumberPad;
    
    //提示文字信息,当text为空显示此信息,浅灰色
    _field.placeholder = @"请输入...";
    
    //是否作为密码输入
    //若为YES则显示圆点
    _field.secureTextEntry = NO;
    
    [self.view addSubview:_field];

    self.field.delegate = self;
}

-(void) touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
    //点击空白处,虚拟键盘回收,不再作为第一响应者
    [self.field resignFirstResponder];
}

// 是否可以进行输入
- (BOOL)textFieldShouldBeginEditing(UITextField *)textField {
    return YES;
}

//是否可以结束输入
-(BOOL)textFieldShouldEndEditing:(UITextField *)textField {
    return YES;
}
// 当用户开始编辑UITextField时调用
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    NSLog(@"正在编辑");
}

// 当用户结束编辑UITextField时调用
- (void)textFieldDidEndEditing:(UITextField *)textField {
    NSLog(@"结束编辑");
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/648773.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

WebGL在历史和考古重建中的应用

WebGL&#xff08;Web Graphics Library&#xff09;是一种基于JavaScript的API&#xff0c;用于在浏览器中呈现2D和3D图形。由于其强大的图形处理能力和广泛的兼容性&#xff0c;WebGL在历史和考古重建中的应用具有重要的意义。以下是WebGL在这一领域的主要应用和详细描述。北…

十大品牌落地台灯有用吗?护眼落地灯十大知名品牌

十大品牌落地台灯有用吗&#xff1f;落地台灯作为这几年家长很关注的家电/学生产品&#xff0c;家里有孩子或者是经常面对电子设备的人士&#xff0c;相信都会对其有所了解并且购买了落地台灯&#xff0c;但是还有些家长对落地台灯的认知不够深&#xff0c;以至于还没有给孩子安…

JUC框架(Semaphore、CountDownLatch、CyclicBarrier)

文章目录 Semaphore(信号量)Semaphore介绍Semaphore基本概念Semaphore使用场景Semaphore示例 CountDownLatch &#xff08;计数器/闭锁&#xff09;CountDownLatch 介绍CountDownLatch 基本概念CountDownLatch 使用场景CountDownLatch 基本方法CountDownLatch 示例 CyclicBarri…

用PhpStudy在本地电脑搭建WordPress网站教程(2024版)

对新手来说&#xff0c;明白了建站3要素后&#xff0c;如果直接购买域名、空间去建站&#xff0c;因为不熟练&#xff0c;反复测试主题、框架、插件等费时费力&#xff0c;等网站建成可能要两三个月&#xff0c;白白损失这段时间的建站费用。那么新手怎么建测试网站来练手呢&am…

Redis使用Set实现点赞功能

文章目录 set 数据类型介绍不排序实现排序实现 set 数据类型介绍 Redis中的set类型是一组无序的字符串值。 set通过其独特的数据结构和丰富的命令提供了在存储和处理集合元素方面的一些非常有用的功能。下面列出了主要的set类型命令&#xff1a; SADD key member1 [member2]&a…

Docker 常用命令大全!!

Docker 常用命令 一、启动类1. 启动 docker2. 关闭 docker3. 重新启动 docker4. docker 设置自启动5. 查看 docker 运行状态6. 查看 docker 版本号等信息7. docker 帮助 二、 镜像类1. 查看镜像2. 搜索镜像3. 拉取镜像4. 运行镜像5. 删除镜像6. 加载镜像7. 保存镜像 三、容器类…

Java 类加载过程和双亲委派模型

Java 类加载过程概述 在 Java 中&#xff0c;类装载器把一个类装入 Java 虚拟机中&#xff0c;要经过三个步骤来完成&#xff1a;装载、链接和初始化&#xff0c;其中链接又可以分成校验、准备、解析 Java类加载过程分为如下步骤&#xff1a; 1.装载&#xff08; 加载&#xf…

Go 语言简介 -- 高效、简洁与现代化编程的完美结合

在现代软件开发领域&#xff0c;选择合适的编程语言对于项目的成功至关重要。Go 语言&#xff08;又称 Golang &#xff09;自 2009 年由Google发布以来&#xff0c;以其简洁的语法、高效的并发模型以及强大的性能&#xff0c;迅速成为开发者们的新宠。Go语言不仅融合了传统编译…

统计每个活动的用户访问量,且每个用户仅统计一次

场景&#xff1a;统计每个活动的用户访问量&#xff0c;且每个用户仅统计一次。 首先活动表是已经存在了的&#xff0c;一般情况下&#xff0c;我们都会在创建一个用户访问表&#xff0c;其中唯一主键是用户ID活动ID作为唯一主键 create table user_visist_activity_record(i…

Latex:newcommand

参考文献&#xff1a; latex中自定义的命令———\newcommand-CSDN博客LaTeX技巧924&#xff1a;详解newcommand的参数和默认值 - LaTeX工作室 (latexstudio.net) 文章目录 (re)newcommand自定义的一些命令 (re)newcommand ”定义命令“ 的定义&#xff1a; \newcommand{<…

GTX IP生成及参数详解(高速收发器九)

如下图所示&#xff0c;在IP Catalog中搜索gt&#xff0c;然后双击7 Series FPGAs Transcelvers Wizard打开IP配置界面。 图1 打开7 Series FPGAs Transcelvers Wizard IP 1、配置GT Selection界面 首先进入GT Selection配置界面&#xff0c;这个界面主要关注红框部分。从前文对…

AOP、注解、EL表达、若依权限,Security原理综合分析

AOP、注解、EL表达、若依权限&#xff0c;Security原理综合分析 案例一&#xff1a;更新、创建增强 需求产生 每个表中均有创建时间、创建人、修改时间、修改人等字段。 在操作时候手动赋值&#xff0c;就会导致编码相对冗余、繁琐&#xff0c;那能不能对于这些公共字段在某…

Vue3学习-用 vite@latest 初始化项目后,遇到无法识别 .vue 文件

引入app界面遇到 我的解决方案 1.根目录创建 env.d.ts&#xff0c;添加 declare module "*.vue" {import type { DefineComponent } from "vue"const vueComponent: DefineComponent<{}, {}, any>export default vueComponent }2.在 tsconfig.json…

iCloud 照片到 Android 指南:帮助您快速将照片从 iCloud 传输到安卓手机

​ 概括 iOS 和 Android 之间的传输是一个复杂的老问题。将 iCloud 照片传输到 Android 似乎是不可能的。放心。现在的高科技已经解决了这个问题。尽管 Apple 和 Android 不提供传输工具&#xff0c;但您仍然有其他有用的选项。这篇文章与您分享了 5 个技巧。因此&#xff0c;…

⌈ 传知代码 ⌋ 实现沉浸式交互故事体验

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

左极限与右极限

左极限与右极限 1. 前言 极限描述了函数在一个定点附近的行为&#xff0c;具体说就是当函数的自变量&#xff08;例如 x x x&#xff09;趋近于某一个值时&#xff0c;函数的因变量&#xff08;例如 y y y&#xff09;会产生什么样的特性&#xff08;或结果&#xff09;。 …

降价!免费!AI大模型开启价格战,企业如何“薅”出绿色财富?

近期&#xff0c;国内大模型技术供应商之间的价格战&#xff0c;使得这项原本成本较高的技术变得更加亲民&#xff0c;极大降低了企业的技术采用门槛。这不仅为企业提供了经济实惠的技术解决方案&#xff0c;更为他们的绿色低碳转型之路带来了新的机遇。 随着全球气候变化问题…

社区矫正程序管理端和小程序(支持人脸识别)

社区矫正作为我国刑事处罚执行方式中独特的种类&#xff0c;从2003年进行试点至今已有近20年的时间&#xff0c;在罪犯改造方面取得了突出成就&#xff0c;在法治国家建设过程中具有十分重要的意义。相较于监狱内服刑的执行方式&#xff0c;社区矫正更加侧重于对服刑人员进行教…

力扣刷题--747. 至少是其他数字两倍的最大数【简单】

题目描述 给你一个整数数组 nums &#xff0c;其中总是存在 唯一的 一个最大整数 。 请你找出数组中的最大元素并检查它是否 至少是数组中每个其他数字的两倍 。如果是&#xff0c;则返回 最大元素的下标 &#xff0c;否则返回 -1 。 示例 1&#xff1a; 输入&#xff1a;n…

AI+低代码,打通企业大模型应用最后一公里!

一、AI的趋势与发展 一夜之间&#xff0c;微软的AI全宇宙似乎已成型。 5月22日凌晨&#xff0c;在一年一度的2024微软Build大会上&#xff0c;微软CEO萨蒂亚纳德拉一口气宣布了50多项AI能力更新&#xff0c;涵盖GPT-4o上云、自研Cobalt芯片、团队版Copilot、SOTA小模型等。 此…