iOS:使用代理模式监听开关状态改变事件
记一次解决跨控制器监听开关状态改变的尝试。
为了统一设置UITableViewCell里的内容,自定义了UITableViewCell类的一个基类,命名为SettingCell。SettingCell里显示的内容由数据模型SettingItem提供:在SettingCell里定义一个属性即可。
@property (nonatomic, strong) SettingItem *item;
再定义几个SettingItem的子类表示显示不同内容的Cell(如图1).由于所有开关状态的归档和解档都一样,故统一在父类SettingItem里实现。但是点击“手势密码”后跳转到下一个控制(如图2)后,需要单独监听手势密码开关的状态,这就涉及到了跨控制器监听开关状态改变事件的问题。我首先想到了代理模式。
图1 图2
首先在SettingCell.h里声明代理方法和属性:
#import <UIKit/UIKit.h> @class SettingItem, SettingCell; @protocol SettingCellDelegate <NSObject> @optional // 监听开关状态改变
- (void)settingCell:(SettingCell *)cell switchChanged:(UISwitch *)switchView; @end @interface SettingCell : UITableViewCell // 存放模型数据
@property (nonatomic, strong) SettingItem *item; @property (nonatomic, assign, getter = isLastRowInSection) BOOL lastRowInSection; + (instancetype)cellWithTableView:(UITableView *)tableView; // 定义代理属性
@property (nonatomic, weak) id<SettingCellDelegate> delegate; @end
然后,在SettingCell.m里初始化开关并注册ValueChanged事件,在switchStateChange:方法里调用代理方法传递开关状态:
- (UISwitch *)switchView
{
if (_switchView == nil) {
_switchView = [[UISwitch alloc] init];
[_switchView addTarget:self action:@selector(switchStateChange:) forControlEvents:UIControlEventValueChanged];
}
return _switchView;
} /**
* 监听开关状态改变
*/
- (void)switchStateChange:(UISwitch *)switchView
{
// NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
// [defaults setBool:self.switchView.isOn forKey:self.item.title];
// [defaults synchronize];
if ([self.delegate respondsToSelector:@selector(settingCell:switchChanged:)]) {
[self.delegate settingCell:self switchChanged:switchView];
} [CoreArchive setBool:self.switchView.isOn key:self.item.title];
}
最后,在图2的控制器里实现代理方法:
- (void)settingCell:(SettingCell *)cell switchChanged:(UISwitch *)switchView
{
NSLog(@"手势密码开关状态改变了-------------------");
}
但是发现点击开关后并没有发现打印结果,窘迫~
检查代理模式的使用方法后发现是没有设置SettingCell的代理为当前控制器(GestureViewController)。问题又来了,在图2的控制器里我根本拿不到SettingCell,无奈只好追本溯源,发现这个控制器又是继承自自定义的一个控制器(BaseSettingViewController),故在父类控制器里的Cell初始化方法里设置代理为当前控制器即可(下面代码第11行)。于是开心地看到打印结果鸟!
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
// 1.创建cell
SettingCell *cell = [SettingCell cellWithTableView:tableView]; // 2.给cell传递模型数据
SettingGroup *group = self.data[indexPath.section];
cell.item = group.items[indexPath.row];
cell.lastRowInSection = (group.items.count - == indexPath.row);
// 设置代理
cell.delegate = self;
// 3.返回cell
return cell;
}
总结思路:
- 涉及到跨控制器数据访问时首先考虑代理模式;
- 当类的继承关系复杂时一定要缕清关系:什么事在基类里统一做,什么事在子类里单独做。
iOS:使用代理模式监听开关状态改变事件的更多相关文章
- 原生js监听input值改变事件
哈哈哈,又来了,今天闲来无事,实验了下原生js监听input value值改变事件,下面就来说道说道: 本来写监听input值便获是用jquery的,之前的随笔写了,就是这个方法,地址:http:// ...
- ios电话拨打进行监听电话状态
#import "ViewController.h" #import <CoreTelephony/CTCallCenter.h> #import <CoreTe ...
- js实现监听浏览器窗口大小改变事件
window.onresize = function(){ }
- IOS-网络(监听网络状态)
// // BWNetWorkTool.h // IOS_0131_检测网络状态 // // Created by ma c on 16/1/31. // Copyright © 2016年 博文科技 ...
- IOS-利用AFNetworking监听网络状态
网络环境检测:检测用户当前所处的网络状态 效果图 1.当蜂窝和wifi同时关闭时候 显示为不可达(AFNetworkReachabilityStatusNotReachable)状态 2.打开蜂窝移 ...
- (原创)用Receiver和SystemService监听网络状态,注册Receiver的两种方式
android中网络编程不可避免地要监听网络状态,wifi或者3G以及以太网,并根据当前状态做出相应决策. 在MyReceiver类中的onReceive方法中获得系统服务 ConnectivityM ...
- Android实时监听网络状态(2)
在开发android应用时,涉及到要进行网络访问,时常需要进行网络状态的检查,以提供给用户必要的提醒.一般可以通过ConnectivityManager来完成该工作. ConnectivityMana ...
- Android实时监听网络状态
Android实时监听网络状态(1) 其实手机在网络方面的的监听也比较重要,有时候我们必须实时监控这个程序的实时网络状态,android在网络断开与连接的时候都会发出广播,我们通过接收系统的广播就 ...
- Android监听电池状态
监听电池状态只需要接收Intent.ACTION_BATTERY_CHANGED的广播即可,当电池状态发生变化时会发出广播. 1.运行状态如下图: (1)连接USB时的状态 (2)断开USB时的状态 ...
随机推荐
- 浅析Java.lang.ProcessBuilder类
最近由于工作需要把用户配置的Hive命令在Linux环境下执行,专门做了一个用户管理界面特地研究了这个不经常用得ProcessBuilder类.所以把自己的学习的资料总结一下. 一.概述 P ...
- [转]opencv3.0 鱼眼相机标定
[原文转自]:http://blog.csdn.net/qq_15947787/article/details/51441031 前两天发表的时候没注意,代码出了点错误,所以修改了一下,重新发上来. ...
- su- 与su的区别
su命令和su -命令最大的本质区别就是:前者只是切换了root身份,但Shell环境仍然是普通用户的Shell:而后者连用户和Shell环境一起切换成root身份了.只有切换了Shell环境才不会出 ...
- Kafka学习笔记-Java简单操作
Maven依赖包: <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka ...
- HTML5 canvas处理图片的各种效果,包括放大缩小涂鸦等
http://www.htmleaf.com/ziliaoku/qianduanjiaocheng/201502151385.html jQuery 缩放 旋转 裁剪图片 Image Cropper ...
- 关于小黄车(ofo共享单车)使用的问题
小黄车即ofo共享单车,号称是全球创立最早.成长最快.规模最大的无桩共享单车创业公司,缔造了"共享单车"概念,致力于解决城市出行问题.它的出现给大家带来了方便,作为一个商业运行的公 ...
- python utf-8 配置
环境:centos6.5,python 2.6 源码文档使用utf-8 #!/usr/bin/python # -*- coding: UTF-8 -*- 字符串默认用utf-8(不用在前面加u了) ...
- Excel 2007 批量删除隐藏的文本框
该方法取自百度知道,该朋友给出函数,我详细写一下方法. 打开有文本框的excel文件. 按 Alt+F11 打开编辑器. 将下面的函数复制进去: Sub deltxbox()Dim s As Shap ...
- mysql安装和mysql图形界面安装以及文本文件导入mysql
本人大一大二一直使用windows系统,被微软爸爸给惯坏了,一看到cmd命令行就吓尿.现在用ubuntu,每一个操作都是语句,也是得到锻炼(个jb). ubuntu安装mysql和python代码 s ...
- 。Java中的一些小细节
1.main方法. ------任何一个Java程序都有一个main方法,它是程序的入口. ------当执行 “ java + 类名 “ 这个命令时,JVM就会去加载这个类,并且寻找这个类中的m ...