zoukankan      html  css  js  c++  java
  • 使用Delegate实现不同页面间的传值

    两个View之间的传值可以有多种方式。但本人觉得最合理最自然并且最安全的方式是通过Delegate方式。

    设想一个场景:

    1. 有两个View,分别是A和B。

    2. 点击A中的某个按钮,出来B。

    3. 对B做某些操作(比如输入文字到textField,选择picker等等)。

    4. 然后点击B中的确定按钮,将在B中进行的操作所产生的数据传递给A。

    这种应用场景在编写iPhone App应用的时候是十分常见的,比如利用modelview来进行某些条件的选择,进行注册操作等等。下面具体说说利用Delegate是如何将View B中的数据传递回View A。

    第一步:

    在B类的类定义之前加入一下代码,定义一个delegate:

    [plain] view plaincopy

    @protocol ViewBControllerDelegate <NSObject>
    - (void) viewAWillDoThisAction:(UIViewController *) currentView;
    @end

    这个delegate定义了一个方法,所有实现了这个delegate的类都必须实现这个方法。

    然后再在B类的类定义中添加一个member,加入以下代码:

    [plain] view plaincopy

    NSObject<FilterSpotsViewControllerDelegate> *view_A;

    从名字来看,就知道待会这个值会被赋予View A。

    第二步:

    让A类实现ViewBControllerDelegate:

    [plain] view plaincopy

    @interface ViewAController : UIViewController <ViewBControllerDelegate>

    并且让A类实现方法viewAWillDoThisAction:

    [plain] view plaincopy

    - (void) viewAWillDoThisAction:(UIViewController *) view_B {
    //利用view_B来传值。如self.a = view_B.a;
    }


    上面代码中,将会在B类中将B类自己(self)的指针传递给view_B(见下面第四步)。这样就可以把B类的数据传递给A类了。

    第三步:

    就如我之前所说的,View A点某个按钮之后,出现View B。假设这个按钮对应的方法是“-(void) pushViewB: (id) sender"。那么应在这个方法中将A类自身的指针(self)传递给之前第一步在B类中定义的成员变量View_A:

    [plain] view plaincopy

    -(void) pushViewB: (id) sender {
    //初始化一个B类,view_B
    view_B.view_A = self; //赋值
    //推出View B
    }


    第四步:

    在B类,假设在View B中做完所有操作之后,点击确定按钮,返回View A,并将数据传回给view A。假设这个确定按钮的方法是-(void)done: (id) sender。那么需要在这个方法中调用A类实现的viewAWillDoThisAction:

    [plain] view plaincopy

    -(void) done: (id) sender {
    [self.view_A viewAWillDoThisAction:self];
    //返回View A
    }


    上面代码注意两个问题:第一是调用view A的实现了delegate的方法,第二是将自身的指针传递给view A的方法,以方便view A能取到view B的数据。

    以上就是整个利用delegate机制来进行两个view之间的传值的过程。这里注意一点:这两个view之间是有关系的(view A推出view B,从view B推出view A)。对于两个完全没有关系的view,如何传值呢?理论上利用delegate也是可以的,但并不是最好的方法。最好的方法是利用NSNotification,留到日后再说。

    多嘴一点,其实说是利用delegate的方式来传值,其本质是传递类的指针来进行类成员的传值(实现了delegate的类A将自身传给了类B,然后类B又将自身传回去给类A),之所以用到delegate的机制,只不过是为了说明这个顺序:当B进行了某个操作的时候,需要A去做另外一件事。这就是delegate的本质。也就是我文章开头所说“最合理最自然”的原因。


    编辑器加载中...

  • 相关阅读:
    [dj]Django外键(ForeignKey)操作以及related_name的作用
    [java]快速创建servlet和springmvc测试项目
    [sql]mybatis中动态sql
    [sql]mysql中使用 where 1=1和 0=1 的作用及好处
    [sql]sql中分组查询/union/join
    JavaScripts学习日记——DOM SAX JAXP DEMO4J XPath
    JavaScripts学习日记——XML DTD Schema
    JavaScripts学习日记——DOM
    JavaScripts学习日记——BOM
    JavaScripts学习日记——ECMAscript
  • 原文地址:https://www.cnblogs.com/wengzilin/p/2396170.html
Copyright © 2011-2022 走看看