问:微信怎样更改实名?
A.需求 1.搭建一个“私人通讯录”Demo 2.模拟登陆界面
3.退出注销 4.增删改查 5.恢复数据(取消修改) 这个代码托管了在github: (本来网速不好,打算用国内的csdn甚至京东,发现github有现成的app,不用使用命令行,速度还可以,就用github了,界面也是最漂亮的) B.基本架构 1. 5个控制器 (1)导航控制器 NavigationController (2)登陆 UIViewController
(3)联系人列表 TableViewController
(4)添加联系人 UIView (5)查看、编辑 UIView C.实现步骤 1.搭建 (1)使用NavigationController作为主控制器 (2)使用storyboard构建UI (3)每个控制器搭配一个相应的类,用以处理各种事件 2.登陆界面 (1)账号、密码的输入框 a.使用TextField b.监听输入事件 <1> 不能使用addTarget方法,因为addTarget只能监听点击事件,不能监听编辑事件 <2> 不能使用代理进行事件监听,代理就是控制器,但是只能监听到开始、结束编辑、允许编辑文字等状态 <3> 使用通知,就能监听到正在编辑的状态了,监听文字的改变 由通知中心转发账号、密码输入框的文字编辑状态信息到控制器,调用指定方法
1 /* 登陆按钮监听账号、密码输入框的通知
2 * 只有当两者都有内容的时候才能激活登陆按钮
3 */
4 - (void) loginButtonListening{
5 // 监听账号输入
6 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.accountText];
7
8 // 监听密码输入
9 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.pwdText];
10 }
11
12 // 记得要在自身被销毁的时候取消消息订阅
13 - (void)dealloc {
14 [[NSNotificationCenter defaultCenter] removeObserver:self];
15 }
16
17 // 登陆按钮监听的触发事件
18 - (void) textChange {
19 // 只有当账号、密码不为空的时候,才能使用登陆按钮
20 self.loginButton.enabled = self.accountText.text.length && self.pwdText.text.length;
21 }
(2)登陆 当有账号、密码的时候才能激活登陆按钮 a.验证账号、密码 使用“登陆界面”控制器拖线到“联系人列表”界面控制器:使用Manual Segue
/** 点击登陆 */
- (IBAction)login {
// 检测账号
if (![self.accountText.text isEqualToString:@"hw"]) {
NSLog(@"账号不存在");
return;
}
// 检测密码
if (![self.pwdText.text isEqualToString:@"123"]) {
NSLog(@"密码不正确");
return;
}
// 根据Segue ID 执行跳转
[self performSegueWithIdentifier:@"contactList" sender:nil];
}
b.使用第三方包实现登陆效果 c.在登陆时,使用一个遮盖禁止用户操作
1 /** 点击登陆 */
2 - (IBAction)login {
3 // 检测账号
4 if (![self.accountText.text isEqualToString:@"hw"]) {
5 [MBProgressHUD showError:@"账号不存在"];
6 return;
7 }
8
9 // 检测密码
10 if (![self.pwdText.text isEqualToString:@"123"]) {
11 [MBProgressHUD showError:@"密码错误"];
12 return;
13 }
14
15 // 登陆中,遮盖屏幕,禁止用户进行其他操作
16 [MBProgressHUD showMessage:@"正在使劲登录中..."];
17
18 // 模拟登陆过程,延迟跳转
19 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
20 // 移除遮盖
21 [MBProgressHUD hideHUD];
22
23 // 根据Segue ID 执行跳转
24 [self performSegueWithIdentifier:@"contactList" sender:nil];
25 });
26 }
d. 使用performSegueWithIndentifier:方法执行指定Segue
1 // 根据Segue ID 执行跳转
2 [self performSegueWithIdentifier:@"contactList" sender:nil];
(3)记住密码 & 自动登陆 a.联动 <1> 取消记住密码,自动取消自动登陆 <2> 勾选了自动登陆,自动勾选记住密码 (使用storyboard拖线也可以完成)
1 /** 点击记住密码 */
2 - (IBAction)keepPwdSwitch {
3 if (!self.keepPwd.isOn) {
4 [self.autoLogin setOn:NO];
5 }
6 }
7
8 /** 点击自动登陆 */
9 - (IBAction)autoLoginSwitch {
10 if (self.autoLogin.isOn) {
11 [self.keepPwd setOn:YES];
12 }
13 }
(4)在跳转生效之前,传输数据,设置“联系人列表”标题 使用来源控制器的“prepareForSegue: sender:”方法(需要自行实现) 拿到目标控制器,设置数据 3.联系人列表 (1)注销 a.注销按钮及其功能 b.提醒警告 使用UIActionSheet控件(这是一个从下往上弹出的底部弹窗控件) 控制器遵守 UIActionSheetDelegate 协议
1 /** 点击注销 */
2 - (IBAction)logout:(UIBarButtonItem *)sender {
3 UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"确定要注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"确定" otherButtonTitles:nil, nil];
4
5 [sheet showInView:self.view];
6 }
7
8 #pragma mark - ActionSheet delegate function
9 - (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
10 if (buttonIndex != 0) return;
11
12 // 弹出一个栈顶控制器,即本控制器,回到上一页
13 [self.navigationController popViewControllerAnimated:YES];
14 }
(2)添加联系人跳转 a.在右上角添加 “ ” 按钮 b.添加一个“添加联系人”控制器和界面 (下文) 4.添加联系人 (1)基础搭建 a.在“联系人列表”界面点击右上角加号跳转,使用自动Segue就可以了 b.添加姓名、电话输入框 c."添加"按钮 d.设置监听事件(姓名、电话和“添加”按钮的监听、事件处理,类似账号、密码和“登陆”按钮)
1 - (void)viewDidLoad {
2 [super viewDidLoad];
3 // Do any additional setup after loading the view.
4
5 // 设置“添加”按钮的激活状态
6 self.addButton.enabled = NO;
7 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.nameText];
8 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.phoneText];
9 }
10
11 - (void)dealloc {
12 // 取消订阅消息监听
13 [[NSNotificationCenter defaultCenter] removeObserver:self];
14 }
15
16 /** 姓名、电话文本编辑消息处理
17 * 只有当姓名、电话不为空的时候才能使用“添加”按钮
18 */
19 - (void) textChange {
20 self.addButton.enabled = self.nameText.text.length && self.phoneText.text.length;
21 }
e.进入即自动弹出键盘
1 // 等界面完全显示完毕,再弹出键盘
2 - (void)viewDidAppear:(BOOL)animated {
3 [super viewDidAppear:animated];
4
5 // 将焦点放在“姓名”输入框
6 [self.nameText becomeFirstResponder];
7 }
(2)数据返传 点击“添加”按钮,把数据传回给“联系人列表” a.关闭当前控制器(“添加联系人”界面) b.传递数据(使用代理) 设置源控制器(“联系人列表”控制器)为目标控制器(“添加联系人”控制器)的代理 点击“添加”按钮的时候,使用代理更改“联系人列表”的数据 AddViewController:
1 /** 点击添加按钮 */
2 - (IBAction)add {
3 // 1.关闭当前控制器
4 [self.navigationController popViewControllerAnimated:YES];
5
6 // 2.使用模型传递数据给上一个控制器(ContactListViewController),使用代理通知数据更新
7 Contact *contact = [[Contact alloc] init];
8 contact.name = self.nameText.text;
9 contact.phone = self.phoneText.text;
10 [self.delegate addViewController:self didAddedContact:contact];
11 }
c.“联系人列表”添加数据 ContactListTableViewController:
1 #pragma mark - AddViewController delegate function
2 /** 添加联系人后,更新联系人列表数据 */
3 - (void)addViewController:(AddViewController *)addViewController didAddedContact:(Contact *)contact {
4 NSMutableArray *mcontacts = [NSMutableArray arrayWithArray:self.contacts];
5 [mcontacts addObject:contact];
6 self.contacts = mcontacts;
7 [self.tableView reloadData];
8 }
5.查看/编辑联系人 (1)拖入一个UIViewController作为“查看/编辑联系人”控制器 a.姓名、电话的TextField b.“保存”按钮 c."编辑/取消" 按钮 (2)跳转Segue设置 a.在“联系人列表”控制器中,指定storyboard的cell指定一个ID b.给上述的cell设置一个自动Segue,指向“查看/编辑联系人”控制器 c.利用storyboard中已经绑定了ID的cell创建cell ContactCell:
1 (instancetype) cellWithTableView:(UITableView *) tableView {
2 // cell ID 要在storyboard中设置好
3 static NSString *ID = @"contactCell";
4 // 先从缓存池寻找,如果找不到就从storyboard中创建一个
5 return [tableView dequeueReusableCellWithIdentifier:ID];
6 }
d.在“联系人列表”控制器的prepareForSegue方法中,根据目标控制器的类型,区分跳转向“添加联系人”控制器和“编辑联系人”控制器 ContactListTableViewController:
1 #pragma mark - Segue相关
2 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
3 // 取得目标控制器
4 id controller = segue.destinationViewController;
5
6 // 判断跳转目标
7 if ([controller isKindOfClass:[AddViewController class]]) {
8 // 如果是“添加联系人”
9 AddViewController *addViewController = controller;
10 addViewController.delegate = self;
11 }
12
13 if ([controller isKindOfClass:[EditViewController class]]) {
14 // 如果是“查看/编辑联系人”
15 EditViewController *editViewController = controller;
16
17 // 取出数据
18 NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
19 editViewController.contact = self.contacts[indexPath.row];
20
21 // 设置代理
22 editViewController.delegate = self;
23 }
24
25 }
(3)传输数据 不能在prepareForSegue中设置目标控制器的控件数据,因为目标控制器的view还没有加载 在目标控制器的viewDidLoad方法中做 EditViewController:
1 - (void)viewDidLoad {
2 [super viewDidLoad];
3 // Do any additional setup after loading the view.
4
5 // 加载数据
6 self.nameText.text = self.contact.name;
7 self.phoneText.text = self.contact.phone;
8
9 // 设置输入监听
10 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.nameText];
11 [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textChange) name:UITextFieldTextDidChangeNotification object:self.phoneText];
12 }
(4)编辑(右上角加上一个“编辑”按钮) a.激活输入框的编辑状态 b.激活“保存”按钮 c.弹出键盘 d.姓名和电话输入框同时为空的时候,保护“保存”按钮 (5)取消编辑(进入“编辑”状态后,将“编辑”按钮转换成“取消”按钮) a.改变“取消”按钮为“编辑”按钮 b.改变输入框为不可编辑 c.收回键盘 e.恢复数据
1 /** 点击“编辑”或"取消” */
2 - (IBAction)editOrCancel:(UIBarButtonItem *)sender {
3 // 转变后的状态
4 BOOL isChangedToEditMode = [sender.title isEqualToString:@"编辑"]? YES:NO;
5
6 if (isChangedToEditMode) {
7 // 点击"编辑"
8 // 1.转变title
9 sender.title = @"取消";
10
11 // 2.转变编辑状态
12 self.nameText.enabled = YES;
13 self.phoneText.enabled = YES;
14 self.saveButton.hidden = NO;
15
16 // 获得输入焦点
17 [self.nameText becomeFirstResponder];
18 } else {
19 // 点击“取消”
20 // 1.转变title
21 sender.title = @"编辑";
22
23 // 2.转变编辑状态
24 self.nameText.enabled = NO;
25 self.phoneText.enabled = NO;
26 self.saveButton.hidden = YES;
27
28 // 3.还原数据
29 self.nameText.text = self.contact.name;
30 self.phoneText.text = self.contact.phone;
31
32 // 4.退出键盘
33 [self.view endEditing:YES];
34 }
35
36 }
37
38 /** 消息监听事件 */
39 - (void) textChange {
40 self.saveButton.enabled = self.nameText.text.length && self.phoneText.text.length;
41 }
(6)保存,返回数据到“联系人列表” 使用代理,和“添加联系人”同理 a.关闭页面 b.传输数据 <1> 更新模型数据 <2> 使用代理方法修改模型数据 c.在“联系人列表”中刷新数据
1 #pragma mark - EditViewController delegate function
2 /** “编辑联系人”的“保存”代理方法, 刷新数据 */
3 - (void)editViewController:(EditViewController *)editViewController didSavedContact:(Contact *)contact {
4 [self.tableView reloadData];
5 }
6.自定义分割线 有数据的cell才显示分割线 (1)系统自带的分割线实际是一个高度只有1的UIVIew (2)设置cell的样式为不带分割线,自行在返回的cell加上分割线 a.自定义一个集成UITableViewCell的类 b.在storyboard设置cell的class为自定义的cell类 c.重写cell的构造方法
1 (instancetype) cellWithTableView:(UITableView *) tableView {
2 // cell ID 要在storyboard中设置好
3 static NSString *ID = @"contactCell";
4 // 先从缓存池寻找,如果找不到就从storyboard中创建一个
5 return [tableView dequeueReusableCellWithIdentifier:ID];
6 }
注意: <1> 从storyboard中创建的cell不会调用initWithStyle: reuseIndentifier:方法,但是也会调用awakeFromNib方法 ==> (1)就算重写initWithStyle: reuseIndentifier:,也不会被调用 (2)把创建分割线的逻辑放在awakeFromNib方法中
1 /**
2 * 如果cell是通过storyboard或者xib创建,不会调用此方法
3 * 如果使用代码创建cell,才会调用这个方法来初始化cell
4 */
5 - (instancetype) initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
6 NSLog(@"initWithStyle");
7 self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
8 return self;
9 }
<2> 由于在awakeFromNib中cell的frame还没被初始化(例如高度永远是44),所以重写layoutSubviews来设置分割线的frame
1 /**
2 * 如果cell是通过storyboard或者xib创建,创建完毕会调用这个方法
3 * 可以在这里初始化cell
4 */
5 - (void) awakeFromNib {
6 // 自定义一个分割线
7 UIView *divideLine = [[UIView alloc] init];
8 [divideLine setBackgroundColor:[UIColor blackColor]];
9 [divideLine setAlpha:0.2];
10 [self.contentView addSubview:divideLine];
11 self.divideLine = divideLine;
12 }
13
14 /**
15 * 在此方法中,cell的frame确定被初始化完成,可以再这里初始化其子控件的frame
16 */
17 - (void)layoutSubviews {
18 // 切记调用父类方法!
19 [super layoutSubviews];
20
21 CGFloat lineHeight = 1;
22 CGFloat lineWidth = self.frame.size.width;
23 CGFloat lineX = 0;
24 CGFloat lineY = self.frame.size.height - 1;
25
26 self.divideLine.frame = CGRectMake(lineX, lineY, lineWidth, lineHeight);
27 }
7.持久化数据 有5种方式
(1)“添加联系人”、“编辑联系人” 保存之后 a.使用plist保存联系人数据(账号、密码也可以用plist模拟实现)
1 #pragma mark - AddViewController delegate function
2 /** 添加联系人后,更新联系人列表数据 */
3 - (void)addViewController:(AddViewController *)addViewController didAddedContact:(Contact *)contact {
4 NSMutableArray *mcontacts = [NSMutableArray arrayWithArray:self.contacts];
5 [mcontacts addObject:contact];
6 self.contacts = mcontacts;
7
8 // 保存数据到plist文件
9 [self saveContactsDataToFile];
10
11 // 刷新界面数据
12 [self.tableView reloadData];
13 }
14
15 #pragma mark - EditViewController delegate function
16 /** “编辑联系人”的“保存”代理方法, 刷新数据 */
17 - (void)editViewController:(EditViewController *)editViewController didSavedContact:(Contact *)contact {
18 // 保存数据
19 [self saveContactsDataToFile];
20 // 刷新数据
21 [self.tableView reloadData];
22 }
23
24 #pragma mark - 加载、保存、读取数据
25 /** 保存联系人数据到plist */
26 - (void) saveContactsDataToFile {
27 // 沙盒路径
28 NSString *path = NSHomeDirectory();
29 // Documents路径
30 NSString *docPath = [path stringByAppendingPathComponent:@"Documents"];
31 // plist文件路径
32 NSString *filePath = [docPath stringByAppendingPathComponent:@"contacts.plist"];
33
34 NSMutableArray *dictArray = [NSMutableArray array];
35 for (Contact *contact in self.contacts) {
36 // 将模型转换成字典进行存储
37 NSDictionary *dict = [Contact dictionaryWithContact:contact];
38 [dictArray addObject:dict];
39 }
40 [dictArray writeToFile:filePath atomically:YES];
41 NSLog(@"save to : %@", filePath);
42 }
b.进入“联系人”列表的时候读取数据
1 /** 加载数据 */
2 - (NSArray *) contacts {
3 if (nil == _contacts) {
4 // 沙盒路径
5 NSString *path = NSHomeDirectory();
6 // Documents路径
7 NSString *docPath = [path stringByAppendingPathComponent:@"Documents"];
8 // plist文件路径
9 NSString *filePath = [docPath stringByAppendingPathComponent:@"contacts.plist"];
10
11 // 如果plist文件不存在
12 NSFileManager *fileManager = [NSFileManager defaultManager];
13 if (![fileManager fileExistsAtPath:filePath]) {
14 _contacts = [NSArray array];
15 return _contacts;
16 }
17
18 // 如果plist文件存在,开始读取
19 NSArray *contacts = [NSArray arrayWithContentsOfFile:filePath];
20 NSMutableArray *mcontacts = [NSMutableArray array];
21 for (NSDictionary *dict in contacts) {
22 Contact *contact = [Contact contactWithDictionary:dict];
23 [mcontacts addObject:contact];
24 }
25
26 _contacts = mcontacts;
27 }
28
29 return _contacts;
30 }
(2)使用preferences自动记住账号、密码 a.进入“登陆”界面,读取登陆状态数据
1 /**
2 * 把初始化代码放在viewDidAppear
3 * 让view完全呈现之后才进行自动登陆,否则拿不到view,hideHUD的时候会失效
4 */
5 - (void)viewDidAppear:(BOOL)animated {
6 // 设置登陆状态
7 [self readLoginStatus];
8
9 // 初始化登陆按钮状态
10 if (!self.accountText.text.length || !self.pwdText.text.length) {
11 self.loginButton.enabled = NO;
12 }
13
14 // 登陆按钮开始监听账号、密码输入框
15 [self loginButtonListening];
16 }
17
18 /** 读取登陆状态 */
19 - (void) readLoginStatus {
20 // 记住密码、自动登录开关状态
21 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
22 self.keepPwd.on = [defaults boolForKey:@"keepPwd"]? YES:NO; // 防止键值对为nil
23 self.autoLogin.on = [defaults boolForKey:@"autoLogin"]? YES:NO;
24
25 // 账号、密码
26 if (self.keepPwd.isOn) {
27 self.accountText.text = [defaults objectForKey:@"account"];
28 self.pwdText.text = [defaults objectForKey:@"pwd"];
29 }
30
31 // 自动登陆
32 if (self.autoLogin.isOn) {
33 [self login];
34 }
35 }
b.点击“登陆”保存登陆状态
1 /** 点击登陆 */
2 - (IBAction)login {
3 // 检测账号
4 if (![self.accountText.text isEqualToString:@"hw"]) {
5 [MBProgressHUD showError:@"账号不存在"];
6 return;
7 }
8
9 // 检测密码
10 if (![self.pwdText.text isEqualToString:@"123"]) {
11 [MBProgressHUD showError:@"密码错误"];
12 return;
13 }
14
15 // 登陆中,遮盖屏幕,禁止用户进行其他操作
16 [MBProgressHUD showMessage:@"正在使劲登录中..."];
17
18 // 模拟登陆过程,延迟跳转
19 dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
20 // 移除遮盖
21 [MBProgressHUD hideHUD];
22
23 // 根据Segue ID 执行跳转
24 [self performSegueWithIdentifier:@"contactList" sender:nil];
25 });
26
27 // 保存登陆状态
28 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
29 [defaults setBool:self.keepPwd.isOn forKey:@"keepPwd"];
30 [defaults setBool:self.autoLogin.isOn forKey:@"autoLogin"];
31
32 // 保存账号、密码信息
33 if (self.keepPwd.isOn) {
34 [defaults setObject:self.accountText.text forKey:@"account"];
35 [defaults setObject:self.pwdText.text forKey:@"pwd"];
36 }
37 }
8.“自动登陆”的细节 (1)模拟登陆的遮盖消除问题 在登陆控制器中,如果在viewDidLoad中调用登陆方法进行登陆,页面进入到“联系人列表”之后,遮盖的信息并不会隐藏,要在viewDidAppear中调用登陆方法,才能正常运行。 (2)在“联系人列表”界面,点击“注销”回到“登陆”界面,依然会触发自动登陆 解决:设置一个私有变量保存自动登陆的许可状态,在非初次进入登陆界面的情况禁止自动登陆
1 /** 自动登陆标识 */
2 @property(nonatomic, assign) BOOL stopAutoLogin;
3
4 - (void)viewDidDisappear:(BOOL)animated {
5 // 当不是初次出现在屏幕上,禁止自动登陆
6 self.stopAutoLogin = YES;
7 }
8
9 /** 读取登陆状态 */
10 - (void) readLoginStatus {
11 // 记住密码、自动登录开关状态
12 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
13 self.keepPwd.on = [defaults boolForKey:@"keepPwd"]? YES:NO; // 防止键值对为nil
14 self.autoLogin.on = [defaults boolForKey:@"autoLogin"]? YES:NO;
15
16 // 账号、密码
17 if (self.keepPwd.isOn) {
18 self.accountText.text = [defaults objectForKey:@"account"];
19 self.pwdText.text = [defaults objectForKey:@"pwd"];
20 }
21
22 // 自动登陆
23 if (!self.stopAutoLogin && self.autoLogin.isOn) {
24 [self login];
25 }
26 }
9.删除数据 在“联系人列表”界面从右往左滑动记录,会弹出“删除”按钮 只需要实现一个tableView协议方法 commitEditingStyle,只需要实现这个方法就会出现“删除”按钮
1 /**
2 * 如果实现了这个方法,就自动实现了滑动删除功能
3 * 点击了“删除”按钮就会调用
4 * 实质是提交了一个编辑操作导致调用(删除/添加/编辑)
5 * @param editingStyle 编辑行为
6 * @param indexPath 操作行号
7 */
8 - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
9 // 如果是删除操作
10 if (editingStyle == UITableViewCellEditingStyleDelete) {
11 // 1.删除数据
12 NSMutableArray *marray = [NSMutableArray arrayWithArray:self.contacts];
13 [marray removeObjectAtIndex:indexPath.row];
14 self.contacts = marray;
15
16 // 2.刷新界面
17 // [self.tableView reloadData];
18 // 只删掉需要删除的一行,不必刷新所有数据
19 // 使用这个方法,必须删除对应的模型数据,数量要对应
20 [self.tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationLeft];
21
22 // 3.更改plist数据
23 [self saveContactsDataToFile];
24 }
25 }
10.编辑状态 在“联系人列表”界面,点击一个按钮,使所有联系人cell进入编辑状态 a.添加一个“垃圾桶”按钮
1 - (void)viewDidLoad {
2 [super viewDidLoad];
3
4 // 设置无系统自带分割线
5 [self.tableView setSeparatorStyle:UITableViewCellSeparatorStyleNone];
6
7 // 取出原来在storyboard中创建的“ ”按钮
8 UIBarButtonItem *addItem = self.navigationItem.rightBarButtonItem;
9
10 // 创建一个“垃圾桶”按钮
11 UIBarButtonItem *deleteItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemTrash target:self action:@selector(deleteCheck)];
12
13 // 都放入到右边的状态栏
14 self.navigationItem.rightBarButtonItems = @[deleteItem, addItem];
15 }
b.编辑状态
1 // 点击状态栏按钮“垃圾桶”,使所有cell进入编辑状态或者退出编辑状态
2 - (void) deleteCheck {
3 // self.tableView.editing = !self.tableView.editing;
4 [self.tableView setEditing:!self.tableView.editing animated:YES];
5 }
c.白边编辑状态的功能键
1 // 改变编辑状态下的编辑按钮
2 - (UITableViewCellEditingStyle) tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath {
3 if (indexPath.row == 0) {
4 // 这里改为“添加”符号,需要自定义事件
5 return UITableViewCellEditingStyleInsert;
6 } else if (indexPath.row == 1) {
7 // none就是什么都没有,没有作用
8 return UITableViewCellEditingStyleNone;
9 } else {
10 // 默认就是“删除”
11 return UITableViewCellEditingStyleDelete;
12 }
13 }
A.需求 1.搭建一个“私人通讯录”Demo 2.模拟登陆界面 账号 密码 记住密码开关 自动登陆开关 登陆按钮 3.退出注销...
1)打开微信,点击【我】,找到【钱包】功能,进入钱包的主界面,点击【银行卡】功能,选择【添加银行卡】,详情如下图所示▼。
2)在打开的页面中,输入银行卡卡号,点击【下一步】,输入与此银行卡相关的姓名、身份证号码、银行预留的手机号码,完成手机验证码认证,支付密码设置等,如下图所示▼。
3)银行卡信息绑定成功之后,就完成了实名认证,并且开通微信支付功能,如下图所示▼。
以上就是更改微信更改实名认证信息的方式,首先需要解绑原认证信息,并且解除所有的银行卡绑定,然后完成新银行卡绑定的同时,就完成了新的实名认证。
微信实名,是我们使用微信支付的前提,是一种安全保障,并不是微信昵称和微信号,实名的更改就意味着微信支付主体的更改。那么显而易见的就是,微信实名更改分两步,第一步解除和注销原有微信支付;第二步,绑定新的微信实名信息。下面以微信7.0.4版本(苹果)为例,给大家详细解说一下,希望对大家有所帮助。
注意:实名更改前一定要确保微信支付钱包里无余额,包括零钱通和财付通所有账户均无余额。
不同版本,不同系统,可能界面会有轻微的差别,但是大致步骤不变。
第一步:点击“我”的界面,然后点击“支付”,进入支付界面。
第二步:支付界面点击右上角“...”,进入支付管理界面。
第三步:在支付管理界面,我们可以直接点击顶部的“实名认证”或者底部的“注销微信支付”进行操作。
实名认证界面如下:点击底部账户更名进行操作。
切记:一定要确保无以下情况,方可进行实名更改,否则无法进行更改。
微信支付注销以后,按提示重新输入新的实名信息即可。如需开通微信支付,再按要求进行绑定与新实名信息一致的银行卡即可。
希望对有需要的朋友有所帮助,如有不理解的请私信,谢谢!
感谢提问,很高兴能回答你的问题。
微信的实名认证信息应该怎么才能够修改?
方法步骤
1.现如今我们已经离不开微信了,
在生活中我们除了能够使用微信联系到自己的朋友,
还能够进行移动支付,生活缴费等等服务,
但是我们在使用微信的时候一定会需要进行实名验证,
那么我们想要修改实名应该怎么办呢?
2.首先我们需要打开微信,
在里面我们切换到我的选项卡,
在里面会看到有一个钱包的选项,
我们打开进入到钱包。
3.进入到钱包之后我们会在页面的右上角看到有一个三个点构成的图标,
我们点击一下,然后就会打开支付中心设置,在里面我们选择支付管理。
4.点击进去之后我们就会看到页面中会有一个使命认证的项目了,
点击之后就能够看到当前账号下认证的身份信息了,
在这里页面最下方会有账户更名的选项,
我们点击之后经过一些身份验证之后我们就能够修改实名啦。
到这一步已全部完成,有不懂的可以关注网络营销专家,一起探讨互联网科技发展。
微信如何更改实名,现在的微信最为一款现象级的社交软件,使用的用户还是非常多的,而且微信有很多的功能必须要经过实名之后才能进行使用,那么下面我们一起来说一说如果给微信更改实名。
微信是手机必备的聊天和支付软件,微信的很多功能需要实名认证之后才能使用,那么当我们在使用微信时,如果遇到需要更改实名认证信息时,如何操作呢?
在“账号安全”界面中就有“注销账号”选项,点击进入。
1)打开微信,点击【我】,点击【钱包】选项。进入钱包管理界面之后,点击右上角的图标,弹出菜单中,选择【支付管理】,详情如下图所示▼。
2)在【支付管理】的界面,选择【注销微信支付】的功能选项。如果有余额,那么需要将余额消费或者提现,清空微信余额才能注销,如下图所示▼。
3)如果微信账号绑定了多张银行卡,那么首先需要解除绑定,点击【解绑所有银行卡】,删除之后返回到【注销微信支付】的页面,点击【确认注销】,如下图所示▼。
4)在打开的页面中,输入原绑定的实名认证信息,如下图所示,分别输入【姓名】和【证件号码】之后,点击【下一步】,如果填写的信息正确,那么就会弹出如下注销成功的信息。
微信更名需要两个步骤:第一步解除和注销微信支付;第二步,绑定新的微信实名信息。
大家好,下文为大家介绍如何注销soul账号。
一、在完成以上的操作之后,我们还需要有最后一步的操作就是完成绑定新的微信实名的认证信息,这是非常重要的,可能很有的用户都是会忽略这个问题的,所以一定要记得绑定新的微信实名的信息。
二、至于说如何的绑定新的微信实名的信息,其实也是非常的简单的,我们打开微信支付,点击进行重新绑定新的属于自己的银行卡信息,输入自己的银行卡账号和密码进行重新的绑定即可。还有最后的一个步骤就是在绑定完成之后,可以给还有进行支付就可以了。
总之,微信想要更改实名,必须要经过两个过程,其一是注销现有的账户,然后在绑定新的属于自己的微信实名信息,那么大家还有什么不同的看法,可以在下方留言,咱们一起探讨!
感谢您的阅读!
这个问题的实际意义是:对于一些想将该微信号的实名认证取消,或者不想使用微信支付的用户。
我们通过上面描述就能知道怎么进行实名更改了。自然,我们要进入到微信界面,因为实名认证是和手机的钱包联系在一起的。所以,我们第一步是点击支付界面,右上角的“...”,进入到支付管理界面。
在支付管理界面,你能清晰的看到实名认证,点击进入,看到实名认证中心,点击箭头指示的方向,点击后,会出现注销微信支付,点击确认注销。
现在进入到重新认证阶段。在这之前,必须提醒大家,如果你的钱包中有余额的话,是不能进行注销的。
我们现在进入重新实名认证,同样点开支付右上角的“...”,进入到支付管理界面。
进行实名认证,分为两种形式:通过身份证验证;通过银行卡认证。
重新认证后,你的实名就已经更换了。
微信现在变得也是越来越大,越来越臃肿了。可是很多细节方面的功能,官方并没有给出太详细的教程,而且客服都是机器人,这让很多对软件不是很熟悉的朋友用起来还是不太方便。今天我就以微信7.0.4版本(安卓)为例,给大家一个详细教程,如何在微信上更改实名。
不管你使用的是哪一个版本的微信,以下方法都是通用的,可能会稍微有点儿区别,但不会有所影响。
第一步,打开微信,点击下方“我”,在这里,直接点击“支付”菜单,以前的版本这里叫“钱包”。意思差不多,现在微信中所有和支付相关的模块,都是这个入口;
第二步,打开“支付”管理界面后,直接点击“钱包”。好多人看到这个界面就蒙圈了,不知道点哪里,这也怪微信,直接使用了色块按钮,而且不明显。
第三步,进入“钱包”界面后,点击“银行卡”这一栏;
第四步,这里就进入了“银行卡”管理了,不管你之前有没有添加银行卡都没关系,我们直接点击“添加银行卡”这一项即可;
第五步,然后就会提示我们输入支付密码,就是平时我们使用微信支付时候所使用的密码,并不是微信的登录密码;
第六步,如果密码无误,就会进入到添加银行卡的界面,在这里不用输入卡号,在持卡人这一栏,最后边有个灰色的图标,点击它;
第七步,点击后就会显示“持卡人说明”信息,我们可以看到,在下方有个“更改实名”按钮,到这里,我们才正式开始做更改实名的动作;
第八步,如果你的微信中有零钱的话,这里会提示你先“提现”,如果你绑定了银行卡的话那就直接提现即可,若没有绑定的话,你点击了提现,它会提示你先绑卡。其实你也可以用其他的方式把钱转走,比如用发红包的方式将钱转到其他微信号上或者发给朋友那里暂存一下;
第九步,当你的微信中零钱已经没有了,此时,就需要将原来已添加的银行卡全部解绑。然后,按上面的步骤走一遍,到第七、第八步后,就可以继续根据提示一步步完成更改实名。大家自己操作,后面的就不在演示。
很多人会有疑问,更改实名后,原来的好友还在吗?这个可以放心,更改实名只是变更当前微信账号的信息,它和我们修改微信昵称、签名等是类似的。只是因为更改实名比较麻烦而已,对我们的微信好友不会产生影响。
一:钱包零钱提现
因为更改实名认证将会注销"支付功能",注销之前需要把钱包里面的零钱提现至银行卡里面,以防财产损失。提现成功之后再注销支付功能。
二:注销微信支付
打开微信,进入钱包,点击右上角"四宫格",接着点击"支付管理”
怎样改ID号?
微信一旦绑定实名之后就无法更改了
一、微信的许多功能都是需要通过实名认证才能实现的,所以要想更改微信的实名认证,那么就必须要进行账户的注销,我们打开微信支付点击右上角的三个小黑点,里面有一个注销微信支付的功能按键,所以只需要把微信现在的这个账户进行注销就可以。
二、那么很多朋友可能会问,微信的账户都是已经注销了,还怎么使用呢,其实这只是注销现在实名认证的微信账号,如果我们要更改现有的实名认证,那么这个是前提。还有就是需要把账户的余额给清理完成,输入已经绑定的银行卡账户,才能完成注销的过程。
在“设置”页面中点击下方的“更多设置”。
点击底部右侧“自己”,然后点中右上角的“设置”。
要是想要取消注销,在“账户安全”界面中点击如图位置的“取消注销”即可。
在“用户注销”界面中输入注册该账号的手机号码以及收到的验证码,点击下方的“提交”按钮,系统就会提醒,点击确定。
打开手机中的soul应用。
在“更多设置”界面中找到并进入“账号安全”。
本文由彩世界注册首页发布于彩世界彩票注册平台官网,转载请注明出处:[iOS基础控件,ios基础控件【彩世界彩票注册平台