pop反向传值 swift_swift push pop - CSDN
  • 原文地址:https://blog.csdn.net/iotjin/article/details/49681595第一个界面 A ,第二个界面B ,从 B 传值 给AB界面.h#import <UIKit/UIKit.h>//第一步 写协议@protocol passValueDelegate &lt...

    原文地址:https://blog.csdn.net/iotjin/article/details/49681595

    第一个界面 A  ,第二个界面B ,从 B 传值 给A


    B界面.h

    #import <UIKit/UIKit.h>


    //第一步 写协议

    @protocol passValueDelegate <NSObject>


    - (void)passValue:(NSString *)stringValues;


    @end



    @interface B : UIViewController


    @property (weaknonatomicIBOutlet UITextField *value2TextField;


    //第二步,声明协议的delegate 属性  代理通常用assingn

    @property(nonatomic,assign)id<passValueDelegate>delegate;


    @end





     /** ---------------------------------------------------------------------------*/

      B 界面的 .m


      //成功跳转上一界面


            

           [_delegate passValue:self.valueTextField.text];// 代理执行方法必须写在pop之前

                

             NSLog(@" valueTextField %@ ",self.valueTextField.text);

                

            [self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:1animated:YES];

      // [self.navigationController  popToRootViewControllerAnimated:YES];

     /** ---------------------------------------------------------------------------*/

    //     刷新cell的      A *a= [[A alloc]init];

    //            a.tableView.delegate=self;

    //            [a.tableView reloadData];










     /** ---------------------------------------------------------------------------*/


    A.m



    #import "B.h"


    @interface A () <passValueDelegate>

    {


    //接收从第2个界面返回的数据

        NSString* _value;


    }

    @property(nonatomic,strong)B *b;


    @end


    - (void)viewDidLoad {

        [super viewDidLoad];

        


        

        //    //为了接收从子界面返回的数据

        _b = [[b alloc]init];

            _b.delegate =self;

        

     //   [self.tableView reloadData];

        

        

    }




    #pragma mark - 从第二个界面返回的数据

    - (void)passValue:(NSString *)stringValues

    {

        

        [self.tableView reloadData];

        _value = stringValues;

        

        NSLog(@" value %@ ",_value);



    }



    展开全文
  • UINavigatioUInController的基本用法和页面传值几种方式本文介绍UINavigationController基本用法,因为涉及多页面顺便介绍页面传值1、手写代码创建UINavigationController手写方式创建很简单 , 首先创建一个项目 ,...

    UINavigationController的基本用法和页面传值几种方式

    本文介绍UINavigationController基本用法,因为涉及多页面顺便介绍页面传值


    1、手写代码创建UINavigationController

    手写方式创建很简单 , 首先创建一个项目 , 默认是从storyboard 加载的。这时候首先去掉默认加载方式 。
    这里写图片描述

    然后在AppDelegate.swiftdidFinishLaunchingWithOptions 中创建
    代码如下:

    
        func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
            // Override point for customization after application launch.
    
            //在这里用代码来创建NavigationController
            window = UIWindow(frame: UIScreen.mainScreen().bounds)
            window?.makeKeyAndVisible()
    
            UINavigationBar.appearance().tintColor = UIColor.whiteColor()
            UINavigationBar.appearance().barTintColor = UIColor(red: 231.0/255.0, green: 95.0/255.0, blue: 53.0/255.0, alpha: 0.3) //修改导航栏背景色
            UINavigationBar.appearance().titleTextAttributes = [NSForegroundColorAttributeName:UIColor.whiteColor()] //为导航栏设置字体颜色等
            let rootCv = ViewController();
            let nav = UINavigationController(rootViewController: rootCv)
            window?.rootViewController = nav
    
            return true
        }
    

    不要一看这么多代码,其实没这么多 。UINavigationBar 开头的都是为这个导航栏设置的样式。完全可以不要用默认的,主要就5行 ,前两行创建window 并让window显示 , 后三行创建导航控制器 , 并设置跟控制器 ,然后把window的根控制器设置成这个导航控制器 。这样就OK了。

    运行后发现有黑框 ,暴力解决 ,设置下背景色就行了 。然后再添加个 BarButtonItem 什么的

      self.view.backgroundColor = UIColor.whiteColor()
            self.navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Next", style: .Plain, target: self, action: "goNext:")
            self.title = "导航标题"  //设置导航栏title(不是  self.navigationController?.title 哦!)
            self.navigationItem.backBarButtonItem = UIBarButtonItem(title: "我把返回修改了", style: .Plain, target: nil, action: nil)

    这里最后一句是修改了返回的BarButtonItem 文字 , 这里设置了标题,又加了个rightBarButtonItem 注册了事件goNext 我们来实现下。

    func goNext(sender:AnyObject){
            print("去下一个咯")
            let mainVc = UIStoryboard(name: "Third", bundle: nil).instantiateViewControllerWithIdentifier("three") as UIViewController
            self.navigationController?.pushViewController(mainVc, animated: true)
        }

    一看这个又晕了 ,中间那些是什么呀 。。首先我们从storyboard创建了一个控制器(手写的看过了,为了多学点知识) ,这里的instantiateViewControllerWithIdentifier 中的three 如下设置
    这里写图片描述

    然后push进去 。 导航控制器是采用栈的方式先进后出 , 用push和pop 。那个storyboard 中很简单就放了一个Label 和一个Button ,等会再介绍那个 ,先看看效果

    这里写图片描述

    然后我们给那个按钮也注册个事件 ,这里直接拖就行了。
    实现如下

     @IBAction func showTabBar(sender: AnyObject) {
            let mainVc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("second") as! UINavigationController
            self.presentViewController(mainVc, animated: true) { () -> Void in
    
            }
        }

    这里还是从storyboard 中加载控制器 , 但是却用了presentViewController ,因为导航控制器不让push导航控制器 ,这边主要是像演示通过storyboard 创建导航控制器

    2、 通过storyboard 创建UINavigationController

    如果你跟我一样用Main.storyboard , 可以先删除默认的那个控制器 , 从右边拖出来一个UINavigationController ,这个会默认带一个UITableViewController , 删掉,拖一个普通的UIViewController 。选中UINavigationController 右键拖到那个UIViewController 选择rootViewController就行了 。然后可以自己拖BarButtonItem 也可以在代码中写 。我这边是拖进来的
    这里写图片描述

    就是这么拖的 , 因为我这边拖过了就不再拖了,注册事件也是拖,跟button一样的。就不再演示 。

    这时候运行效果。
    这里写图片描述

    这里是用presentViewController 弹出的返回用dismissViewControllerAnimated

     @IBAction func goBack(sender: UIBarButtonItem) {
            self.dismissViewControllerAnimated(true) { () -> Void in
                print("返回")
            }
        }

    导航控制器基本操作很简单 ,下面看下载不同页面中正反传值

    3、页面传值的几种方式

    • 正面反面传值 (协议)

    大家看到那个页面我们放了三个按钮和一个输入框 ,按钮都注册了事件。然后手写了一个新的控制器 ,里面是一个返回按钮和几个label 还有一个输入框 。

    当我们点击第一个按钮的时候进入下一个控制器 , push进去的 ,那个控制器有个方法 。

    func  passParams(tmpStr: String){
            lb.text = tmpStr
        }

    所以我们在push前,调用这个方法正面传值, 当然你可以直接给他的共有属性赋值。

    let vc = ViewControllerFour()
    let value = tf1.text
    vc.passParams(value!)
            self.navigationController?.pushViewController(vc, animated: true)

    很简单, lb.text = tmpStr 会把传过来的值赋值给label

    反向传值这里使用了代理,先声明一个协议

    protocol ParameterDelegate{
        func passParams(tmpStr: String)
    }

    然后在我们第一个页面实现这个协议 。实现对应的方法

        func passParams(tmpStr: String){
            tf1.text = tmpStr
        }

    然后在第二页面声明代理为自己的变量

     var delegate:ParameterDelegate?

    在push之前把自己设置为第二个页面的代理

      let vc = ViewControllerFour()
     vc.delegate = self  //通过代理进行反向传值
     let value = tf1.text
     vc.passParams(value!)
            self.navigationController?.pushViewController(vc, animated: true)

    注意到没,比刚才多一句话

    OK ,这样就搞定了。来看效果 !
    这里写图片描述

    • 第二种方法 (通过segue进行的传值)

    直接通过storyboard拖拽, 话说storyboard做界面还真方便 , 需要好好研究一下

    重新拖一个控制器然后连线,我这边已经拖好了,我就演示下连线

    这里写图片描述
    然后在代码中

      //通过segue进行的传值
        override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
            if segue.identifier == "toshow" {
                let vc = segue.destinationViewController as! ViewControllerTwoShow
                vc.tmpStr = tf1.text
                //vc.setValue(tf1, forKey: "tmpStr")
            }
        }

    在目标控制器中定义了变量tmpStr (后面会把代码分享出来)

    看下效果
    这里写图片描述

    • 通过通知的方式
        let vc = ViewControllerFour()
            vc.delegate = self  //通过代理进行反向传值
    
            self.presentViewController(vc, animated: true) { () -> Void in
    //发布一条通知NSNotificationCenter.defaultCenter().postNotificationName("DefaultNotif", object:self.tf1.text)
            }

    先注册一个通知 , 展现界面完成的时候发布一个通知 。在另一个界面的viewWillAppear接收通知 。

     override func viewWillAppear(animated: Bool) {
            //self.navigationController?.hidesBarsOnSwipe = true
            self.navigationController?.setNavigationBarHidden(true, animated: true) //隐藏导航栏
    
            NSNotificationCenter.defaultCenter().addObserver(self, selector: "doSomeT:", name: "DefaultNotif", object: nil)
        }

    对应方法

    func doSomeT(title:NSNotification){
            lb1.text = title.object as? String
        }

    看看效果 :
    这里写图片描述

    大概就这么多吧 , 最后把源码发上来吧, 语文不太好估计没讲清楚,大家可以看源码。以后源码都放这个地址了(觉得还行的话给个star 哦)
    githubSwiftStudy

    展开全文
  • swift闭包传值

    2015-10-18 10:55:06
    swift中闭包可以像object-c中 block...两个控制器 ViewController 和 SecondViewController , SecondViewController反向传值给ViewController. 点击NavigationbBar 的返回键(相当于pop操作) 运行结果

    swift中闭包可以像object-c中 block一样传值.

    两个控制器  ViewController 和 SecondViewController , SecondViewController反向传值给ViewController.


    点击NavigationbBar 的返回键(相当于pop操作)

    运行结果



    展开全文
  • 值传递方式: 将第二页里面的值, 在pop的时候传递回来给首页. 本文的操作流程: 首页 push –> 第二页 pop –> 首页 PS: 第二页有个 UITextField 用于输入文本信息, 然后把第二页录入的信息传回首页. OC代码 第二页...

    值传递方式: 将第二页里面的值, 在pop的时候传递回来给首页.
    本文的操作流程: 首页 push –> 第二页 pop –> 首页
    PS: 第二页有个 UITextField 用于输入文本信息, 然后把第二页录入的信息传回首页.

    OC代码

    第二页 .h文件的代码:

    @property(nonatomic, copy) void(^callBack)(NSString *text);

    第二页 .m文件在需要pop的地方添加以下代码:

    if(self.callBack != nil)
    {
        self.callBack(self.textField.text);
    }
    [self.navigationController popViewControllerAnimated:YES];

    首页 在需要push到第二页的地方添加以下代码:

    // 在这里, secondVC 是第二页的控制器名称
    secondVC.callBack = ^(NSString *text)
    {
        self.label.text = text;
    };

    Swift 代码

    第二页 代码

    /// 在类的最上方定义回调的闭包
    /// 笔者建议通过类似于OC中的 typedef 对闭包的类型进行一个重命名
    /// 如: 
    /// typealias sendValueCallBack = (String)->Void
    /// var callBack:sendValueCallBack?
    var callBack:((String)->Void)?
    
    // 在需要 pop 的地方添加
    if let callback = self.callBack, let text = self.textField.text {
        callback(text)
    }
    self.navigationController?.popViewController(animated: true)

    首页 代码

    secondVC.callBack = myGetText
    
    func myGetText(text:String) {
        self.label.text = text
    }
    展开全文
  • 在日常开发过程中我们为了使这个项目,页面精简 美观易懂,往往采用组件式开发,会对一个复杂的完整页面分割成一个个UI view ,UItableviewcell 等控件类,或者我们会在某些网络请求回调 和异步操作跳转页面。...
  • 场景:从A页面跳转到B页面,从A页面传参数到B页面再从B页面返回并回传参数。 1.在入口文件定义Navigator:引入A页面,配置属性:默认首页(参数可自定义) initialRoute={{name:"a",component:A}};...
  • 首先,由首页VC点击消息按钮跳转消息VC,判断没有登录则直接跳转登录VC,登陆成功后跳转消息VC,消息VC返回首页VC。要做的是在登录VC中获取首页VC来跳转消息VC。
  • swift笔记

    2020-02-04 10:11:11
    Swift5.1 https://docs.swift.org/swift-book/LanguageGuide/Subscripts.html 1、swift没有隐式转化 Swift中没有隐式转化,不会将整形自动转成浮点型 let m = 32 let n = 3.14 let result = m + n 错误写法 ...
  • 第六周Swift总结

    2019-02-28 14:57:59
    ##day One 如果是ViewController就用presen方法...如果是navigation就用push方法进行跳转前进 用pop跳转后退 func buttonAction(){ self.view.addTransitionAnimation(0.4, type: TransitionType.Fade, direct...
  • Programming Language(编程语言) 语法特性概论 学习一门语言最痛苦的反而是大量的细节语法,譬如字符串截取、数组或者字典类型的索引之类的。下面要进行讨论的一些语法特性是目前流行的一些语言的总结,可能有些语言...
  • ReactiveCocoa学习笔记

    2016-11-30 16:13:30
    最近在学习RAC框架,断断续续的看了好久,看的文章博客可以说少说也得有一两百,所以这是一个综合的产物,也可以算是一个学习笔记,毕竟好记性不如烂笔头,记录下来,以供以后复习。如有侵权,联系立删。...
  • IOS面试题目及答案1

    2019-12-20 13:28:47
    第一大类OC面试题 一.设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。 1). MVC模式:Model View Control,把模型 视图 控制器 ...2)....3)....
  • 目录 一、基础知识点 二、第三方框架 三、算法 四、编码格式(优化细节) 五、其他知识点 本人精心整理了很全面iOS面试题资料,如果你想学想加入我们请关注我私信“面试题”可以领取!!!记住一定要私信 ...
  • Flutter学习知识点总结

    2019-03-20 14:39:57
    一、Dart语言简介 Dart语言是一种真正面向对象的语言。下面我挑几点比较重要的简单实用的介绍一下,因为文章后面会涉及这些语法。 函数式编程 说Dart是真正的面向对象的语言就在于它把函数也认为是对象,类型为...
  • 目录 一、基础知识点 二、第三方框架 三、算法 四、编码格式(优化细节) 五、其他知识点 一、基础知识点 ... 你知道哪些设计模式,并简要叙述?... 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的...
  • IOS面试题总结

    2019-04-24 10:36:11
    目录 一、基础知识点 二、第三方框架 三、算法 四、编码格式(优化细节) 五、其他知识点 一、基础知识点 ... 1.... 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。... 1).... 2)....
  • #一、基础知识点 1. 设计模式是什么? 你知道哪些设计模式,并简要叙述? 设计模式是一种编码经验,就是用比较成熟的逻辑去处理某一种类型的事情。 1). MVC模式:Model View Control,把模型 视图 控制器...2)....3)....4)....
  • iOS面试题及答案

    2018-12-07 10:47:30
    C语言相关面试题 1.static有什么用途? 答案:在C语言中,static主要定义全局静态变量,定义局部静态变量,定义静态函数。 static 属于静态变量,使用它修饰的变量生命周期是整个源程序。 @1....
1 2
收藏数 25
精华内容 10
关键字:

pop反向传值 swift