iOS如何利用Delegate来实现两个UIView之间的传值

6 篇文章 0 订阅
5 篇文章 0 订阅

(推荐本人创建的一个iOS开源代码收集网站 Code4App

两个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:

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

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

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

NSObject<FilterSpotsViewControllerDelegate> *view_A;

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

第二步:

让A类实现ViewBControllerDelegate:

@interface ViewAController : UIViewController <ViewBControllerDelegate>

并且让A类实现方法viewAWillDoThisAction:

- (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:

-(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:

-(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的本质。也就是我文章开头所说“最合理最自然”的原因。






 




  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
回答: 在iOS开发中,可以使用Block和delegate实现一对多的回调。使用delegate时,首先需要定义一个delegate协议,其中包含回调方法。然后在需要进行回调的地方,设置delegate并调用回调方法。具体实现可以参考以下代码示例:\[2\] ``` // 定义delegate协议 protocol FirstCellDelegate: class { func firstCellBtnTap(_ cell: firstTableViewCell) } // 在需要进行回调的地方设置delegate并调用回调方法 weak var delegate: FirstCellDelegate? // 调用回调方法 if let delegate = self.delegate { delegate.firstCellBtnTap(self) } // 实现delegate回调方法 func firstCellBtnTap(_ cell: firstTableViewCell) { let cellIndexPath = tableView.indexPath(for: cell) print("delegate回调 section:\(cellIndexPath?.section ?? 0), row:\(cellIndexPath?.row ?? 0)") } ``` 另外,使用Block也可以实现一对多的回调。Block可以作为函数表达式递给API,可以选择性地存储,并且可以被多个线程使用。Block不仅包含了在回调时需要执行的代码,还包含了执行期间所需的数据。具体实现可以参考以下代码示例:\[3\] ``` // 定义Block回调 typealias CallbackBlock = () -> Void // 在需要进行回调的地方使用Block进行回调 var callback: CallbackBlock? // 调用回调 callback?() ``` 通过使用Block和delegate,可以实现一对多的回调,满足不同场景下的需求。 #### 引用[.reference_title] - *1* [Block实现iOS回调](https://blog.csdn.net/feelinghappy/article/details/119870367)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [iOS Block与Delegate的用法,各自优缺点及使用场景](https://blog.csdn.net/huangshanfeng/article/details/82106580)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值