IOS界面传值-OC

1、页面跳转

由 ViewController 页面跳转至 NextViewController 页面

(1)ViewController

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

@interface ViewController : UIViewController


@end

  • ViewController.m
#import "ViewController.h"
#import "NextViewController.h"

@interface ViewController ()



@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) UIButton *button;



@end


@implementation ViewController


//懒加载 UILabel
-(UILabel *) label{
    if (_label == nil) {
        _label = [[UILabel alloc]initWithFrame:CGRectMake(100, 100, 200, 50)];
        _label.backgroundColor = [UIColor blackColor];
        _label.textColor = [UIColor whiteColor];
        _label.font = [UIFont systemFontOfSize:20];
    }
    return _label;
}



//懒加载 UIButton
-(UIButton *) button{
    if (_button == nil) {
        _button = [[UIButton alloc]initWithFrame:CGRectMake(100, 200, 200, 50)];
        _button.backgroundColor = [UIColor redColor];
        //setTitle:forState: 是 UIButton 的方法,允许你为按钮的不同状态设置不同的标题
        //为按钮在 普通状态 (UIControlStateNormal) 下设置标题为 "跳转至下个页面"
        [_button setTitle:@"跳转至下个页面" forState:UIControlStateNormal];
        //setTitleColor:forState: 是 UIButton 的方法,允许你为不同状态下的按钮标题设置不同的颜色
        //为按钮在 触摸抬起 (UIControlEventTouchUpInside) 事件时,设置标题颜色为白色 ([UIColor whiteColor])
        [_button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        
        //点击事件
        //addTarget:action:forControlEvents:
        //target: 触发事件时的目标对象。通常是 self,即当前类的实例
        //action: 事件触发时调用的方法的 选择器,通过 @selector 来指定方法
        //forControlEvents: 指定触发事件的类型
        
        //UIControlEventTouchUpInside 按钮的 触摸抬起 事件
        [_button addTarget:self action:@selector(zlzButtonClick) forControlEvents:UIControlEventTouchUpInside];
        
        
    }
    return _button;
}


//按钮点击事件
-(void)zlzButtonClick{
    NextViewController *nextVC = [[NextViewController alloc]init];
    //NextViewController 需要全屏展示
    nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
    
    
    //presentViewController:animated:completion:
    //viewControllerToPresent: 需要展示的视图控制器
    //animated: 是否使用动画过渡
    //completion: 动画完成后的回调,可以是 nil
    [self presentViewController:nextVC animated:YES completion:nil];
}




/**
 
 •    viewDidLoad:视图加载后,初始化视图。
 •    viewWillAppear::视图即将显示,准备更新 UI。
 •    viewDidAppear::视图已显示,启动交互或动画。
 •    viewWillDisappear::视图即将隐藏,保存数据。
 •    viewDidDisappear::视图已隐藏,释放资源或暂停任务。
 **/




//视图加载
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor greenColor];
    NSLog(@"First viewDidLoad");
    //添加控件至根View
    [self.view addSubview:self.label];
    [self.view addSubview:self.button];
}




-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"------First viewWillAppear");
}



- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    NSLog(@"------First viewWillLayoutSubviews");
}

- (void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    NSLog(@"------First viewDidLayoutSubviews");
}



- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"------First viewDidAppear");
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    NSLog(@"------First viewWillDisappear");
}

- (void)viewDidDisappear:(BOOL)animated{
    NSLog(@"------First viewDidDisappear");
}




@end



(2)NextViewController

  • NextViewController.h
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface NextViewController : UIViewController


@end

NS_ASSUME_NONNULL_END
  • NextViewController.m

#import "NextViewController.h"

@interface NextViewController ()


@property (strong, nonatomic) UITextField *textFiled;
@property (strong, nonatomic) UIButton *button;


@end

@implementation NextViewController


-(UITextField *)textFiled{
    if (_textFiled == nil) {
        _textFiled = [[UITextField alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
        _textFiled.textColor = [UIColor blackColor];
        _textFiled.borderStyle = UITextBorderStyleLine;
    }
    
    return _textFiled;
}



-(UIButton *) button{
    if (_button == nil) {
        _button = [[UIButton alloc]initWithFrame:CGRectMake(100, 400, 200, 50)];
        _button.backgroundColor = [UIColor redColor];
        [_button setTitle:@"返回上一个页面" forState:UIControlStateNormal];
        [_button setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
        
        //点击事件
        [_button addTarget:self action:@selector(zlzBackClick) forControlEvents:UIControlEventTouchUpInside];
    }
    
    return _button;
}




-(void)zlzBackClick{
    
    // dismissViewControllerAnimated:animated:completion:
    //用来 关闭当前视图控制器 的方法,通常用于关闭通过 presentViewController:animated:completion: 模态展示的视图控制器
    //completion:nil:表示关闭完成后执行的回调
    [self dismissViewControllerAnimated:YES completion:nil];
}





- (void)viewDidLoad {
    [super viewDidLoad];
    NSLog(@"------Second viewDidLoad");
    self.view.backgroundColor = [UIColor yellowColor];
    [self.view addSubview:self.textFiled];
    [self.view addSubview:self.button];
}


- (void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"------Second viewWillAppear");
}



- (void)viewWillLayoutSubviews{
    [super viewWillLayoutSubviews];
    NSLog(@"------Second viewWillLayoutSubviews");
}

- (void)viewDidLayoutSubviews{
    [super viewDidLayoutSubviews];
    NSLog(@"------Second viewDidLayoutSubviews");
}




- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    NSLog(@"------Second viewDidAppear");
}

- (void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    NSLog(@"------Second viewWillDisappear");
}

- (void)viewDidDisappear:(BOOL)animated{
    NSLog(@"------Second viewDidDisappear");
}




@end

2、界面传值

2.1、属性传值

  • 在 NextViewController.h 添加属性 str
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface NextViewController : UIViewController



//属性传值
@property (nonatomic, strong) NSString *str;



@end

NS_ASSUME_NONNULL_END

  • 在 ViewController.m 的跳转点击事件中 为NextViewController中的属性str 赋值
//按钮点击事件
-(void)zlzButtonClick{
    NextViewController *nextVC = [[NextViewController alloc]init];
    //NextViewController 需要全屏展示
    nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
    
    
    //属性传值---传递
    nextVC.str = @"属性传值";
    

    //presentViewController:animated:completion:
    //viewControllerToPresent: 需要展示的视图控制器
    //animated: 是否使用动画过渡
    //completion: 动画完成后的回调,可以是 nil
    [self presentViewController:nextVC animated:YES completion:nil];
}

  • 在 NextViewController.m 中 textFiled 懒加载时赋值
-(UITextField *)textFiled{
    if (_textFiled == nil) {
        _textFiled = [[UITextField alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
        _textFiled.textColor = [UIColor blackColor];
        _textFiled.borderStyle = UITextBorderStyleLine;
        
        //属性传值---接收并显示
        _textFiled.text = self.str;
    }
    
    return _textFiled;
}

  • 效果

2.2、单例传值

(1)创建单例

  • DefaultInstance.h

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface DefaultInstance : NSObject


+(instancetype)getInstance;

@property (nonatomic, strong) NSString *instanceStr;

@end

NS_ASSUME_NONNULL_END

  • DefaultInstance.m

#import "DefaultInstance.h"

@implementation DefaultInstance


//类方法---创建单例对象
+(instancetype)getInstance{
    //首次创建会 将 sharedVC 赋值为 nil,然后创建一个对象
    //非首次都会直接返回上次的值
    static DefaultInstance *instance = nil;
    if (instance == nil) {
        instance = [[DefaultInstance alloc]init];
    }
    return instance;
}


@end

(2)正向传值

  • 在 ViewController.m 的跳转点击事件,为单例的属性值赋值
//按钮点击事件
-(void)zlzButtonClick{
    NextViewController *nextVC = [[NextViewController alloc]init];
    //NextViewController 需要全屏展示
    nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
    
    
    //单例传值---正向传递
    [DefaultInstance getInstance].instanceStr = @"单例传值";
    
    
    //presentViewController:animated:completion:
    //viewControllerToPresent: 需要展示的视图控制器
    //animated: 是否使用动画过渡
    //completion: 动画完成后的回调,可以是 nil
    [self presentViewController:nextVC animated:YES completion:nil];
}

  • 在 NextViewController.m 的 textFiled懒加载时赋值
-(UITextField *)textFiled{
    if (_textFiled == nil) {
        _textFiled = [[UITextField alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
        _textFiled.textColor = [UIColor blackColor];
        _textFiled.borderStyle = UITextBorderStyleLine;

        //单例传值---接收并显示
        _textFiled.text = [DefaultInstance getInstance].instanceStr;
    }
    
    return _textFiled;
}

  • 效果

(3)反向传值

  • 在 NextViewController.m 的返回点击事件中,为单例中的属性赋值
-(void)zlzBackClick{
    
    
    //单例传值---反向传递
    NSLog(@"单例传值---反向传递: %@",self.textFiled.text);
    [DefaultInstance getInstance].instanceStr = self.textFiled.text;
    
    // dismissViewControllerAnimated:animated:completion:
    //用来 关闭当前视图控制器 的方法,通常用于关闭通过 presentViewController:animated:completion: 模态展示的视图控制器
    //completion:nil:表示关闭完成后执行的回调
    [self dismissViewControllerAnimated:YES completion:nil];
}

  • 在 ViewController.m 的 viewWillAppear() 方法中,获取单例属性值并展示
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"------First viewWillAppear");
    //单例传值---反向接收并展示
    NSLog(@"单例传值---反向接收并展示:%@", [DefaultInstance getInstance].instanceStr);
    self.label.text = [DefaultInstance getInstance].instanceStr;
}

  • 效果

2.3、NSUserDefaults传值

NSUserDefaults传值与单例传值类似,区别是单例传值是在内存中创建单例,而NSUserDefaults 则是在磁盘文件中的。

(1)正向传值

  • 在 ViewController.m 中的跳转点击事件中将值写入文件
//按钮点击事件
-(void)zlzButtonClick{
    NextViewController *nextVC = [[NextViewController alloc]init];
    //NextViewController 需要全屏展示
    nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
    
    
    //NSUserDefaults-正向传值(存入磁盘文件)
    [[NSUserDefaults standardUserDefaults] setObject:@"NSUserDefaults传值" forKey:@"zlzKey"];
    //写入
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    
    //presentViewController:animated:completion:
    //viewControllerToPresent: 需要展示的视图控制器
    //animated: 是否使用动画过渡
    //completion: 动画完成后的回调,可以是 nil
    [self presentViewController:nextVC animated:YES completion:nil];
}

  • 在 NextViewController.m 的 textFiled 懒加载时赋值
-(UITextField *)textFiled{
    if (_textFiled == nil) {
        _textFiled = [[UITextField alloc]initWithFrame:CGRectMake(100, 300, 200, 50)];
        _textFiled.textColor = [UIColor blackColor];
        _textFiled.borderStyle = UITextBorderStyleLine;
        

        //NSUserDefaults传值---接受并显示(从磁盘文件中读取)
        _textFiled.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"zlzKey"];
        
    }
    
    return _textFiled;
}

  • 效果

(2)反向传值

  • 在 NextViewController.m 中的返回点击事件中将值写入文件
-(void)zlzBackClick{
    
    //NSUserDefaults传值---反向传递
    NSLog(@"NSUserDefaults传值---反向传递:%@", self.textFiled.text);
    [[NSUserDefaults standardUserDefaults] setObject:self.textFiled.text forKey:@"zlzBackKey"];
    [[NSUserDefaults standardUserDefaults] synchronize];
    
    
    // dismissViewControllerAnimated:animated:completion:
    //用来 关闭当前视图控制器 的方法,通常用于关闭通过 presentViewController:animated:completion: 模态展示的视图控制器
    //completion:nil:表示关闭完成后执行的回调
    [self dismissViewControllerAnimated:YES completion:nil];
}

  • 在 ViewController.m 中的 viewWillAppear() 方法中获取文件中的值
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    NSLog(@"------First viewWillAppear");

    //NSUserDefaults传值---反向接收并展示
    NSLog(@"NSUserDefaults---反向接收并展示:%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"zlzBackKey"]);
    self.label.text = [[NSUserDefaults standardUserDefaults] objectForKey:@"zlzBackKey"];
}

  • 效果

2.4、代理传值

  • 代理传值主要应用于反向传值,即本示例中 NextViewController -> ViewController 传值
  • 委托方:NextViewController
  • 代理方:ViewController

(1)委托方 NextViewController 定义协议

  • 在 NextViewController.h 中创建协议

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN



//委托方定义协议
@protocol zlzPassValueDelegate <NSObject>

//协议定义一个方法
-(void)passValue:(NSString*)value;

@end



@interface NextViewController : UIViewController



//属性传值
@property (nonatomic, strong) NSString *str;



//定义一个持有协议的id指针
//weak是为了防止指针循环引用
@property (weak)id<zlzPassValueDelegate> zlzDelegate;



@end

NS_ASSUME_NONNULL_END

  • 在 NextViewController.m 中调用协议方法
-(void)zlzBackClick{
    
    //代理传值---反向传递
    [self.zlzDelegate passValue:self.textFiled.text];
    
    
    
    // dismissViewControllerAnimated:animated:completion:
    //用来 关闭当前视图控制器 的方法,通常用于关闭通过 presentViewController:animated:completion: 模态展示的视图控制器
    //completion:nil:表示关闭完成后执行的回调
    [self dismissViewControllerAnimated:YES completion:nil];
}

(2)代理方 ViewController 实现协议方法

  • 在 ViewController.m 中实现协议方法
#import "ViewController.h"
#import "NextViewController.h"

@interface ViewController ()<zlzPassValueDelegate>   //遵守协议


@property (nonatomic, strong) UILabel *label;
@property (nonatomic, strong) UIButton *button;



@end

@implementation ViewController


//...省略部分代码


//代理传值---实现协议方法
-(void)passValue:(NSString *)value{
    self.label.text = value;
}


@end

(3)绑定代理关系

  • 在 ViewController.m 的跳转点击事件中,设置 NextViewController 的代理是自己

//按钮点击事件
-(void)zlzButtonClick{
    NextViewController *nextVC = [[NextViewController alloc]init];
    //NextViewController 需要全屏展示
    nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
    
    
    
    //代理传值---设置代理关系
    nextVC.zlzDelegate = self;
    
    
    //presentViewController:animated:completion:
    //viewControllerToPresent: 需要展示的视图控制器
    //animated: 是否使用动画过渡
    //completion: 动画完成后的回调,可以是 nil
    [self presentViewController:nextVC animated:YES completion:nil];
}

2.5、block传值

block传值与代理传值有点类似,也是主要应用于反向传值,但是使用起来比代理传值要简单。

  • 在 NextViewController.h 中定义 block
#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN


@interface NextViewController : UIViewController



//属性传值
@property (nonatomic, strong) NSString *str;


// 定义一个 block 进行页面反向传值
//copy属性是为了防止 block 循环引用
//block就是一个属性
//^就是block的标志
@property (copy) void (^zlzBlock)(NSString*);


@end

NS_ASSUME_NONNULL_END
  • 在 NextViewController.m 中的返回点击事件中调用 block 方法
-(void)zlzBackClick{
    
    //block传值---反向传递
    self.zlzBlock(self.textFiled.text);
    
    
    
    // dismissViewControllerAnimated:animated:completion:
    //用来 关闭当前视图控制器 的方法,通常用于关闭通过 presentViewController:animated:completion: 模态展示的视图控制器
    //completion:nil:表示关闭完成后执行的回调
    [self dismissViewControllerAnimated:YES completion:nil];
}

  • 在 ViewController.m 中的跳转点击事件中实现 属性 block
-(void)zlzButtonClick{
    NextViewController *nextVC = [[NextViewController alloc]init];
    //NextViewController 需要全屏展示
    nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
        
    
    
    //block传值---实现block-接收来自页面2的值
    nextVC.zlzBlock = ^(NSString *value){
        self.label.text = value;
    };
    
    
    
    //presentViewController:animated:completion:
    //viewControllerToPresent: 需要展示的视图控制器
    //animated: 是否使用动画过渡
    //completion: 动画完成后的回调,可以是 nil
    [self presentViewController:nextVC animated:YES completion:nil];
}

2.6、通知传值

通知传值更灵活,主要用于跨页面跳转时。

类似于Android中的广播。

(1)接收方 ViewController

  • 在 ViewController.m 的跳转点击事件中,设置通知监听
-(void)zlzButtonClick{
    NextViewController *nextVC = [[NextViewController alloc]init];
    //NextViewController 需要全屏展示
    nextVC.modalPresentationStyle = UIModalPresentationFullScreen;
    

    
    //通知传值---添加监听,等待页面2的传值
    //addObserver:self 添加监听者为自己
    //通知的名称zlzNotify
    //object:nil 表示所有的发送者,只要是名为zlzNotify通知的都监听接收
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(dealWithNotify:) name:@"zlzNotify" object:nil];
    
    
    
    
    
    //presentViewController:animated:completion:
    //viewControllerToPresent: 需要展示的视图控制器
    //animated: 是否使用动画过渡
    //completion: 动画完成后的回调,可以是 nil
    [self presentViewController:nextVC animated:YES completion:nil];
}



//接收到通知后的处理---参数1:通知
-(void)dealWithNotify:(NSNotification*)notification{
    self.label.text = notification.userInfo[@"zlzNotificationKey"];
}

(2)发送方 NextViewController

  • 在 NextViewController.m 的返回点击事件中发送通知
-(void)zlzBackClick{
    
   
    //通知传值---发送通知
    //object:nil表示群发
    [[NSNotificationCenter defaultCenter]postNotificationName:@"zlzNotify" object:nil userInfo:@{@"zlzNotificationKey":self.textFiled.text}];
    
    
    
    // dismissViewControllerAnimated:animated:completion:
    //用来 关闭当前视图控制器 的方法,通常用于关闭通过 presentViewController:animated:completion: 模态展示的视图控制器
    //completion:nil:表示关闭完成后执行的回调
    [self dismissViewControllerAnimated:YES completion:nil];
}

3、总结

属性传值简单的正向传值,不能跨页面传值
单例传值可以正向反向传值,可以跨页面,但是需要创建一个单例对象
NSUserDefaults传值类似单例传值,区别是单例传值是把值写入内存,而它是把值写入沙盒文件
代理传值主要用于反向传值,一对一,必须两个页面建立代理关系
block传值

主要用于反向传值,一对一

代理传值能做的它都能做,但他不能取代代理传值

通知传值可以跨页面传值,多对多

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

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

相关文章

树的模拟实现

一.链式前向星 所谓链式前向星&#xff0c;就是用链表的方式实现树。其中的链表是用数组模拟实现的链表。 首先我们需要创建一个足够大的数组h&#xff0c;作为所有结点的哨兵位。创建两个足够大的数组e和ne&#xff0c;一个作为数据域&#xff0c;一个作为指针域。创建一个变…

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…

Redis集群模式下主从复制和哨兵模式

Redis主从复制是由一个Redis服务器或实例(主节点)来控制一个Redis服务器或实例(从节点),从节点从主节点获取数据更新数据 集群模式下主从数据复制过程 从服务器连接到主服务器,发送SYNC命令。主服务器接收到SYNC命令后,开始执行BGSAVE命令生成RDB文件。主服务器BGSAVE执…

高难度下的一闪---白金ACT游戏设计思想的一点体会

1、以前光环的开发者好像提出过一个理论&#xff0c;大意是游戏要让玩家保持30秒的循环&#xff0c; 持续下去。大意跟后来的心流接近。 2、根据我自身的开发体会&#xff0c;想要保持正回路&#xff0c;并不容易。 一个是要保持适当的挑战性&#xff0c;毫无难度的低幼式玩法…

页面滚动下拉时,元素变为fixed浮动,上拉到顶部时恢复原状,js代码以视频示例

页面滚动下拉时,元素变为fixed浮动js代码 以视频示例 <style>video{width:100%;height:auto}.div2,#float1{position:fixed;_position:absolute;top:45px;right:0; z-index:250;}button{float:right;display:block;margin:5px} </style><section id"abou…

算法题(32):三数之和

审题&#xff1a; 需要我们找到满足以下三个条件的所有三元组&#xff0c;并存在二维数组中返回 1.三个元素相加为0 2.三个元素的下标不可相同 3.三元组的元素不可完全相同 思路&#xff1a; 混乱的数据不利于进行操作&#xff0c;所以我们先进行排序 我们可以采取枚举的方法进…

科研绘图系列:R语言绘制Y轴截断分组柱状图(y-axis break bar plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍特点意义加载R包数据下载导入数据数据预处理画图输出总结系统信息介绍 Y轴截断分组柱状图是一种特殊的柱状图,其特点是Y轴的刻度被截断,即在某个范围内省略了部分刻度。这种图表…

PHP民宿酒店预订系统小程序源码

&#x1f3e1;民宿酒店预订系统 基于ThinkPHPuniappuView框架精心构建的多门店民宿酒店预订管理系统&#xff0c;能够迅速为您搭建起专属的、功能全面且操作便捷的民宿酒店预订小程序。 该系统不仅涵盖了预订、退房、WIFI连接、用户反馈、周边信息展示等核心功能&#xff0c;更…

前端 图片上鼠标画矩形框,标注文字,任意删除

效果&#xff1a; 页面描述&#xff1a; 对给定的几张图片&#xff0c;每张能用鼠标在图上画框&#xff0c;标注相关文字&#xff0c;框的颜色和文字内容能自定义改变&#xff0c;能删除任意画过的框。 实现思路&#xff1a; 1、对给定的这几张图片&#xff0c;用分页器绑定…

shell练习

1、shell 脚本写出检测 /tmp/size.log 文件如果存在显示它的内容&#xff0c;不存在则创建一个文件将创建时间写入。 2、写一个 shel1 脚本,实现批量添加 20个用户,用户名为user01-20,密码为user 后面跟5个随机字符。 3、编写个shel 脚本将/usr/local 日录下大于10M的文件转移…

day01-HTML-CSS——基础标签样式表格标签表单标签

目录 此篇为简写笔记下端1-3为之前笔记&#xff08;强迫症、保证文章连续性&#xff09;完整版笔记代码模仿新浪新闻首页完成审核不通过发不出去HTMLCSS1 HTML1.1 介绍1.1.1 WebStrom中基本配置 1.2 快速入门1.3 基础标签1.3.1 标题标签1.3.2 hr标签1.3.3 字体标签1.3.4 换行标…

大疆上云API连接遥控器和无人机

文章目录 1、部署大疆上云API关于如何连接我们自己部署的上云API2、开启无人机和遥控器并连接自己部署的上云API如果遥控器和无人机没有对频的情况下即只有遥控器没有无人机的情况下如果遥控器和无人机已经对频好了的情况下 4、订阅无人机或遥控器的主题信息4.1、订阅无人机实时…

如何用 SSH 访问 QNX 虚拟机

QNX 虚拟机默认是开启 SSH 服务的&#xff0c;如果要用 SSH 访问 QNX 虚拟机&#xff0c;就需要知道虚拟机的 IP 地址&#xff0c;用户和密码。本文我们来看看如何获取这些参数。 1. 启动虚拟机 启动过程很慢&#xff0c;请耐心等待。 2. 查看 IP 地址 等待 IDE 连接到虚拟机。…

【Vue + Antv X6】可拖拽流程图组件

使用事项&#xff1a; ❗先放个组件上来&#xff0c;使用手册有空会补全 ❗需要下载依赖 “antv/x6”: “^2.18.1”, “antv/x6-plugin-dnd”: “^2.1.1”, 组件&#xff1a; 组件使用&#xff1a; <flowChart :key"flowChartKey" ref"flowChart" lef…

在线或离线llama.cpp安装和模型启动

该版本安装时间是2025-01-10&#xff0c;因为不同版本可能安装上会有所不同&#xff0c;下面也会讲到。 先说下问题——按照官方文档找不到执行命令llama-cli或./llama-cli 先附上llama.cpp的github地址&#xff1a;https://github.com/ggerganov/llama.cpp&#xff0c;build…

一个运行在浏览器中的开源Web操作系统Puter本地部署与远程访问

文章目录 前言1.关于Puter2.本地部署Puter3.Puter简单使用4. 安装内网穿透5.配置puter公网地址6. 配置固定公网地址 &#x1f4a1; 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击跳转到网站…

上市公司专利数据、专利申请、专利授权和质量指标计算(1990-2022年)-社科数据

上市公司专利数据、专利申请、专利授权和质量指标计算&#xff08;1990-2022年&#xff09;-社科数据https://download.csdn.net/download/paofuluolijiang/90028569 https://download.csdn.net/download/paofuluolijiang/90028569 专利数据作为衡量企业创新能力和技术实力的…

js:事件流

事件流 事件流是指事件完整执行过程中的流动路径 一个事件流需要经过两个阶段&#xff1a;捕获阶段&#xff0c;冒泡阶段 捕获阶段是在dom树里获取目标元素的过程&#xff0c;从大到小 冒泡阶段是获取以后回到开始&#xff0c;从小到大&#xff0c;像冒泡一样 实际开发中大…

嵌入式入门Day38

C Day1 第一个C程序C中的输入输出输出操作coutcin练习 命名空间使用方法自定义命名空间冲突问题 C对字符串的扩充C风格字符串的使用定义以及初始化C风格字符串与C风格字符串的转换C风格的字符串的关系运算常用的成员变量输入方法 布尔类型C对堆区空间使用的扩充作业 第一个C程序…

FFmpeg音视频流媒体,视频编解码性能优化

你是不是也有过这样一个疑问&#xff1a;视频如何从一个简单的文件变成你手机上快速播放的短片&#xff0c;或者是那种占满大屏幕的超高清大片&#xff1f;它背后的法宝&#xff0c;离不开一个神奇的工具——FFmpeg&#xff01;说它强大&#xff0c;完全不为过&#xff0c;它在…