• iOS中的导航条UINavigationController(UISegmentedControl)的基本使用(界面中传值的3中方法,单例,属性,代理)


    Appdelegate中

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
        self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
        //1.创建单视图控制器对象,
        FirstViewController *firstVC = [[FirstViewController alloc] init];
         //2.创建导航控制器,并且知道那个导航控制器的根视图控制器
        //0  64
        UINavigationController *navigatinVC = [[UINavigationController alloc] initWithRootViewController:firstVC];
        //3.将 导航控制器 作为window的根视图控制器
        self.window.rootViewController = navigatinVC;
        
        //4.释放
        [firstVC release];
        [navigatinVC release];
        self.window.backgroundColor = [UIColor whiteColor];
        [self.window makeKeyAndVisible];
        return YES;
    }

    FirstViewController

    #import "FirstViewController.h"
    #import "SecondViewController.h"
    #import "Singleton.h"
    //代理传值第四步:服从协议
    @interface FirstViewController () <SecondViewControllerdelegate>
    
    @end
    
    /**
     *  导航控制器的工作原理
     导航控制器以栈的形式管理视图控制器,当进入下一界面时,该视图控制器入栈,当返回上一界面时,该视图控制器出栈,入栈前,视图控制器开辟空间,出栈后,视图控制器空间被系统回收,屏幕用于显示的是导航控制器的栈顶元素
     */
    @implementation FirstViewController
    #pragma mark --second view controller delegate
    //代理传值第五步;前一个界面实现协议中的方法
    - (void)passValue:(NSString *)data
    {
       UILabel * label = (UILabel *)[self.view viewWithTag:200];
        label.text = data;
       //NSString *dd = [[(UILabel *)[self.view viewWithTag:200]] text];
    }
    
    
    #pragma mark -self.view
    /*
    //将要出现
    - (void)viewWillAppear:(BOOL)animated
    {
        
        [super viewWillAppear:animated];
        
    }
    //已经出现
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
    //    NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    //     NSLog(@"superView--%@",self.view.superview);
    }
    //将要消失
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
       // NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    }
    //已经消失
    - (void)viewDidDisappear:(BOOL)animated
    {
        [super viewDidDisappear:animated];
        //NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    }
    
    */
    
    
    /**
     *  界面键传值之一:从前往后传
     葵花宝典:属性传值
     招式一:在后一个界面定义属性(属性的类型,要和传输数据的类型一致)
     招式二:在从前一个界面进入下一个界面之前,将数据传给下一界面.
     */
    
    
    
    - (void)viewDidLoad {
         NSLog(@"%s, %d", __FUNCTION__, __LINE__);
        NSLog(@"superView--%@",self.view.superview);
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.view.backgroundColor = [UIColor redColor];
        //进入下一界面 button
        [self setupButton];
        [self configureNavigationBarCommonPropety];
        //[self customizationNavigationBarContent];
        
        
        
        
        //修改导航条上显示的文字的大小和颜色(针对所有界面统一设置)
    //    NSDictionary *dic = @{NSForegroundColorAttributeName:[UIColor redColor],NSFontAttributeName:[UIFont systemFontOfSize:20]};
    //    self.navigationController.navigationBar.titleTextAttributes = dic;
    //    [self setTextField];
    //    [self showNextlabel];
    }
    - (void)setTextField{
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 250, 280, 40)];
       // textField.backgroundColor = [UIColor blueColor];
        //设置tag
        textField.tag = 100;
        textField.borderStyle = UITextBorderStyleRoundedRect;
        textField.placeholder = @"请输入内容让下一个界面显示";
        [self.view addSubview:textField];
        [textField release];
    }
    - (void)showNextlabel{
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 310, 280, 40)];
        label.tag = 200;
        label.backgroundColor = [UIColor blueColor];
        label.text = @"显示下一个文本内容";
        [self.view addSubview:label];
        [label release];
    }
    //单独定制导航条
    - (void)customizationNavigationBarContent{
        //1.配置导航条显示的文字
        self.navigationItem.title = @"第一个界面";
        //2.配置导航条的titleView
        UISegmentedControl *segmentCont = [[UISegmentedControl alloc] initWithItems:@[@"消息",@"通话"]];
        
        self.navigationItem.titleView = segmentCont;
        
        [segmentCont release];
        //左侧部分
        //3.配置Left
        UIBarButtonItem *leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(handleLeftBarButtonAction:)];
        self.navigationItem.leftBarButtonItem = leftBarButtonItem;
        
        [leftBarButtonItem release];
        //配置右侧部分
        UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(handleRightBarButtonAction:)];
        self.navigationItem.rightBarButtonItem = rightBarButtonItem;
        [rightBarButtonItem release];
    }
    
    #pragma mark - handle left bar button action
    - (void)handleLeftBarButtonAction:(UIBarButtonItem *)barItem
    {
        NSLog(@"点击了左侧!");
    }
    - (void)handleRightBarButtonAction:(UIBarButtonItem *)barItem
    {
        NSLog(@"点击了右侧!");
    }
    //配置导航条,配置完成之后所有界面的导航条效果一样
    - (void)configureNavigationBarCommonPropety{
        //1.修改导航条的颜色
        self.navigationController.navigationBar.backgroundColor = [UIColor grayColor];
        //2.修改导航条的渲染颜色
        self.navigationController.navigationBar.tintColor = [UIColor orangeColor];
        //3.关闭导航条的毛玻璃效果
        //self.navigationController.navigationBar.translucent = YES;
        //当关闭导航条毛玻璃效果之后,导航控制器的contentView向下偏移64
        
        //4.影藏导航条
        self.navigationController.navigationBar.hidden = NO;
        //5.设置导航图片
        /**
         *  图片尺寸小于44 或者大于44小于64,图片平铺显示到状态条和导航条
         当图片尺寸等于44时,图片只会显示在导航条
         当图片尺寸等于64时,图片会显示在状态和导航条上
         */
        [self.navigationController.navigationBar setBackgroundImage:[UIImage imageNamed:@"32030.png"] forBarMetrics:UIBarMetricsDefault];
    }
    
    
    
    
    - (void)setupButton{
        UIButton *btnName =[UIButton buttonWithType:UIButtonTypeSystem];
        btnName.frame = CGRectMake(20, 100, 280, 40);
        [btnName setTitle:@"进入下一界面" forState:UIControlStateNormal];
        btnName.backgroundColor = [UIColor orangeColor];
        [btnName addTarget:self action:@selector(handlePushBtn:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btnName];
    }
    
    
    - (void)handlePushBtn:(UIButton *)button
    {
        //属性传值从前往后传
        /*
        //1.创建第二个视图控制器对象
        SecondViewController *secondVC = [[SecondViewController alloc] init];
        //2.通过导航控制器push到下一个界面(视图控制器自带的 navigationContrller 属性能够获取到当前视图控制器的导航控制器,然后,通过导航控制器进行push)
        //第二个界面接收数据
        secondVC.data = [(UITextField *)[self.view viewWithTag:100] text];
        
        
        
        
        [self.navigationController pushViewController:secondVC animated:YES];
        //3.释放
        [secondVC release];
        */
     
    //    //代理传值,从后往前传
    //    
    //    //1.创建第二个视图控制器对象
    //    SecondViewController *secondVC = [[SecondViewController alloc] init];
    //    
    //    //代理传值  第三步,给后一个界面,指定代理对象
    //    secondVC.delegate = self;
    //
    //    //2.通过导航控制器push到下一个界面(视图控制器自带的 navigationContrller 属性能够获取到当前视图控制器的导航控制器,然后,通过导航控制器进行push)
    //    
    //    [self.navigationController pushViewController:secondVC animated:YES];
    //    //3.释放
    //    [secondVC release];
        
        
        
        //单例传值
        
        //1.创建第二个视图控制器对象
        SecondViewController *secondVC = [[SecondViewController alloc] init];
        //单例传值第三步
        [Singleton mianSingleton].textFieldData = [(UITextField *)[self.view viewWithTag:100] text];
        //2.通过导航控制器push到下一个界面(视图控制器自带的 navigationContrller 属性能够获取到当前视图控制器的导航控制器,然后,通过导航控制器进行push)
        
        [self.navigationController pushViewController:secondVC animated:YES];
        //3.释放
        [secondVC release];
    
    }
    
    @end

    SecondViewController.h中设置代理

    #import <UIKit/UIKit.h>
    
    //代理传值第一步:定义协议
    @protocol SecondViewControllerdelegate <NSObject>
    
    - (void)passValue:(NSString *)data;
    
    @end
    
    @interface SecondViewController : UIViewController
    //属性传值第一步:后一个界面定义属性
    @property (nonatomic, copy)NSString *data;
    //代理传值 第二步:定义代理属性,存储代理
    @property (nonatomic, assign) id<SecondViewControllerdelegate>delegate;
    @end

    SecondViewController.m

    #import "SecondViewController.h"
    #import "ThirdViewController.h"
    //延展
    @interface SecondViewController ()
    
    @end
    
    @implementation SecondViewController
    
    /**
     * 界面切换时,视图的变换过程
     1.从前一个进入到下一个界面
     A push B, 此时 方法的处罚顺序 A - viewWillDisappear ,B - viewWillAppear A- viewDidDisappear, B - viewDidAppear
     2.从后一个界面返回到前一个界面
     B pop A 此时的f方法触发顺序为B - viewWillDisappear ,A - viewWillAppear B- viewDidDisappear, A - viewDidAppear
     */
    /*
    - (void)viewWillAppear:(BOOL)animated
    {
        
        [super viewWillAppear:animated];
        NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    }
    - (void)viewDidAppear:(BOOL)animated
    {
        [super viewDidAppear:animated];
        NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    }
    - (void)viewWillDisappear:(BOOL)animated
    {
        [super viewWillDisappear:animated];
        NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    }
    
    - (void)viewDidDisappear:(BOOL)animated
    {
        [super viewDidDisappear:animated];
        NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    }
    */
    
    /**
     *  界面间传值之二:从后往前传值
     辟邪简谱:代理传值 (代理事前一个界面,协议在后一个界面写)
     后一个界面是委托方,前一个界面是被委托方.
     招式一:在后一个界面定义协议(定义一个用于传值的方法,而且方法必须要有参数,参数必须要与所传数据的类型保持一致)
     招式二:在后一个界面定义代理属性,用来保存代理对象.
     招式三:设置后一个界面的代理 ---- 在前一个界面,进入后一个界面之前,设置前一个界面为后一个代理.
     招式四:前一个界面服从协议
     招式五:前一个界面实现协议中的方法.
     招式六:后一个界面让代理执行协议中的方法(执行方法是,把传输的数据作为方法的参数进行参数进行传递),时机:返回上一界面之前
     */
    
    
    - (void)viewDidLoad {
         NSLog(@"%s, %d", __FUNCTION__, __LINE__);
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        self.view.backgroundColor = [UIColor yellowColor];
        [self setupButton];
        [self returnupButton];
        [self customizationNavigationBarContent];
        [self setTextField];
        [self showNextlabel];
    }
    
    - (void)setTextField{
        UITextField *textField = [[UITextField alloc] initWithFrame:CGRectMake(20, 250, 280, 40)];
        textField.backgroundColor = [UIColor blueColor];
        textField.tag = 200;
        textField.placeholder = @"请输入内容让下一个界面显示";
        [self.view addSubview:textField];
        [textField release];
    }
    - (void)showNextlabel{
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(20, 310, 280, 40)];
        label.backgroundColor = [UIColor blueColor];
        label.text = self.data;
        [self.view addSubview:label];
        [label release];
    }
    
    
    - (void)customizationNavigationBarContent{
        //1.配置导航条显示的文字
        self.navigationItem.title = @"第二个界面";
    }
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    - (void)setupButton{
        UIButton *btnName = [UIButton buttonWithType:UIButtonTypeSystem];
        btnName.frame = CGRectMake(20, 100, 280, 40);
        [btnName setTitle:@"进入下一界面" forState:UIControlStateNormal];
        btnName.backgroundColor = [UIColor orangeColor];
        [btnName addTarget:self action:@selector(handlePushBtn:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btnName];
    }
    - (void)returnupButton{
        UIButton *btnName = [UIButton buttonWithType:UIButtonTypeSystem];
        btnName.frame = CGRectMake(20, 200, 280, 40);
        [btnName setTitle:@"返回一界面" forState:UIControlStateNormal];
        btnName.backgroundColor = [UIColor orangeColor];
        [btnName addTarget:self action:@selector(handlePopBtn:) forControlEvents:UIControlEventTouchUpInside];
        [self.view addSubview:btnName];
    }
    - (void)handlePushBtn:(UIButton *)button
    {
        //1.创建第二个视图控制器对象
        ThirdViewController *thirdVC = [[ThirdViewController alloc] init];
        //2.通过导航控制器push到下一个界面(视图控制器自带的 navigationContrller 属性能够获取到当前视图控制器的导航控制器,然后,通过导航控制器进行push)
        [self.navigationController pushViewController:thirdVC animated:YES];
        //3.释放
        [thirdVC release];
        
    }
    //返回上一界面
    - (void)handlePopBtn:(UIButton *)button
    {
        //代理传值第六步:让代理执行任务
        //安全处理,判段代理是否实现了方法,防止崩溃
        if ([self.delegate respondsToSelector:@selector(passValue:)]) {
            [self.delegate passValue:[(UITextField *)[self.view viewWithTag:200] text]];
        }
        [self.navigationController popViewControllerAnimated:YES];
        
    }
    -(void)dealloc
    {
        [_data release];
        [super dealloc];
    }
    @end

    Singleton.h 单例传值

    #import <Foundation/Foundation.h>
    /**
     *界面间传值之三:多个界面之间传值
     九阴真经:单例传值
     招式1:定义单例类,提供创建单例对象的+号方法.
     2.在单例类中定义属性,存储要传递的数据.(属性数据类型要与传递的数据的类型一致)
     3.在进入下一个界面之前,将数据让单例对象保存
     4.在其他界面中直接从单例中获取数据即可.
     */
    @interface Singleton : NSObject
    //创建+号方法,提供创建单例对象的方法 (单例命名规范,以main,share,standard,default开头)
    //单例类的优势:(1)节省空间 2.共享内存单元
    
    + (Singleton *)mianSingleton;
    @property (nonatomic, copy)NSString *textFieldData;
    @end

    Singleton.m

    @implementation Singleton
    //单例的空间在整个程序运行期间都不会回收,会存在内存泄露问题,它的存在是为了解决待定问题
    + (Singleton *)mianSingleton{
        //静态变量
        static Singleton *single = nil;
        if (!single) {
            single = [[Singleton alloc] init];
        }
        return single;
        
    }
    @end
  • 相关阅读:
    全链路压测(1):认识全链路压测
    碎片式的技术笔记
    聊聊传统压测和全链路压测的区别
    生产全链路压测常态化方案
    C++选择文件打开方式的函数
    常用的一些 git 命令
    MyBatis 批量插入数据的 3 种方法!
    MyBatis Plus 批量数据插入功能,yyds!
    什么是可中断锁?有什么用?怎么实现?
    1.3w字,一文详解死锁!
  • 原文地址:https://www.cnblogs.com/wohaoxue/p/4764683.html
Copyright © 2020-2023  润新知