03-0612-私人通讯录通讯录(代理解耦)

//  XMGLoginViewController.h
//  小码哥通讯录
#import <UIKit/UIKit.h>

@interface XMGLoginViewController : UIViewController

@end
//
//  XMGLoginViewController.m
//  小码哥通讯录
#import "XMGLoginViewController.h"

#import "MBProgressHUD+XMG.h"

@interface XMGLoginViewController ()<UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UIButton *loginBtn;

@property (weak, nonatomic) IBOutlet UITextField *accountField;
@property (weak, nonatomic) IBOutlet UITextField *pwdField;

@property (weak, nonatomic) IBOutlet UISwitch *rmbPwdSwitch;
@property (weak, nonatomic) IBOutlet UISwitch *autoLoginSwitch;
@end
/*
 来源控制器传递给目的控制器:顺传
 数据传值:
 1.接收方一定要有属性接收
 2.传递方必须要拿到接收方

 */
/*
 1.[self performSegueWithIdentifier]
 2.创建segue
 3.设置来源控制器segue.sourceViewController = self
 4.创建目的控制器,segue.destinationViewController = 目的控制器
 5.[self prepareForSegue]跳转之前的准备操作
 6.[segue perform]
 7.判断下segue的类型,如果是push,拿到导航控制器push
 [self.navigationController pushViewController:segue.destinationViewController animated:YES];
 */
@implementation XMGLoginViewController

// 在执行跳转之前的时候调用
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    UIViewController *vc = segue.destinationViewController;
    vc.title = [NSString stringWithFormat:@"%@的联系人列表", _accountField.text];
    NSLog(@"%@--%@",segue.sourceViewController,segue.destinationViewController);
}

// 点击了登录按钮的时候调用
// xmg 123
- (IBAction)login:(id)sender {

    // 提示用户,正在登录ing...
    [MBProgressHUD showMessage:@"正在登录ing..."];

    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

        // 隐藏蒙版
        [MBProgressHUD hideHUD];

        // 验证下账号和密码是否正确
        if ([_accountField.text isEqualToString:@"xmg"] && [_pwdField.text isEqualToString:@"123"]) { // 输入正确

            // 直接跳转
            // 跳转到联系人界面
            [self performSegueWithIdentifier:@"login2Contact" sender:nil];

        }else{ // 账号或者密码错误

            // 提示用户账号或者密码错误
            [MBProgressHUD showError:@"账号或者密码错误"];

        }

    });

}

// 记住密码开关状态改变的时候调用
- (IBAction)rmbPwdChange:(id)sender {
    // 如果取消记住密码,自动登录也需要取消勾选

    if (_rmbPwdSwitch.on == NO) { // 取消记住密码
        // 取消自动登录
        [_autoLoginSwitch setOn:NO animated:YES];
    }

}

// 自动登录开关状态改变的时候调用
- (IBAction)autoLoginChange:(id)sender {

    // 如果勾选了自动登录,记住密码也要勾选
    if (_autoLoginSwitch.on == YES) {
        [_rmbPwdSwitch setOn:YES animated:YES];

    }

}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    // 给文本框添加监听器,及时监听文本框内容的改变
    [_accountField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
    [_pwdField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];

    // 判断下登录按钮能否点击
    [self textChange];

}

// 任一一个文本框的内容改变都会调用
- (void)textChange
{
    _loginBtn.enabled = _accountField.text.length && _pwdField.text.length;
    NSLog(@"%@--%@",_accountField.text,_pwdField.text);
}

@end
//
//  XMGContactViewController.h
//  小码哥通讯录
#import <UIKit/UIKit.h>
@class XMGContact;
@interface XMGContactViewController : UITableViewController

@end
//
//  XMGContactViewController.m
//  小码哥通讯录
#import "XMGContactViewController.h"
#import "XMGAddViewController.h"
#import "XMGContact.h"
@interface XMGContactViewController ()<UIActionSheetDelegate,XMGAddViewControllerDelegate>

@property (nonatomic, strong) NSMutableArray *contacts;

@end

@implementation XMGContactViewController

- (NSMutableArray *)contacts
{
    if (_contacts == nil) {

        _contacts = [NSMutableArray array];

    }
    return _contacts;
}

// 跳转之前的时候调用
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{

    // 给添加控制器传递联系人控制器属性
    XMGAddViewController *addVc = segue.destinationViewController;

    addVc.delegate = self;
}

- (void)addViewController:(XMGAddViewController *)addVc didClickAddBtnWithContact:(XMGContact *)contact
{
    // 把添加界面的联系人模型传递到联系人界面

    // 把联系人模型保存到数组
    [self.contacts addObject:contact];

    // 刷新表格
    [self.tableView reloadData];

}

// 点击注销的时候调用
- (IBAction)logout:(id)sender {

    // 弹出actionSheet
    UIActionSheet *sheet = [[UIActionSheet alloc] initWithTitle:@"是否注销?" delegate:self cancelButtonTitle:@"取消" destructiveButtonTitle:@"注销" otherButtonTitles:nil, nil];

    [sheet showInView:self.view];

}
#pragma mark - UIActionSheetDelegate
// 点击UIActionSheet控件上的按钮调用
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if (buttonIndex == 0) { // 点击了注销

        [self.navigationController popViewControllerAnimated:YES];

    }

}

- (void)viewDidLoad {
    [super viewDidLoad];

    // Uncomment the following line to preserve selection between presentations.
    // self.clearsSelectionOnViewWillAppear = NO;

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem;
}

#pragma mark - Table view data source

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    return self.contacts.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    // 创建标示符
    static NSString *ID = @"cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:ID];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:ID];
    }

    // 获取模型
    XMGContact *c = self.contacts[indexPath.row];

    cell.textLabel.text = c.name;
    cell.detailTextLabel.text = c.phone;

    return cell;
}

/*
// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}
*/

/*
// Override to support editing the table view.
- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (editingStyle == UITableViewCellEditingStyleDelete) {
        // Delete the row from the data source
        [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade];
    } else if (editingStyle == UITableViewCellEditingStyleInsert) {
        // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view
    }
}
*/

/*
// Override to support rearranging the table view.
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
}
*/

/*
// Override to support conditional rearranging of the table view.
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the item to be re-orderable.
    return YES;
}
*/

/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/

@end
//
//  XMGAddViewController.h
//  小码哥通讯录
#import <UIKit/UIKit.h>

@class XMGAddViewController,XMGContact;
@protocol XMGAddViewControllerDelegate <NSObject>

@optional
- (void)addViewController:(XMGAddViewController *)addVc didClickAddBtnWithContact:(XMGContact *)contact;

@end

@class XMGContactViewController;

@interface XMGAddViewController : UIViewController

@property (nonatomic, weak) id<XMGAddViewControllerDelegate> delegate;

@end
//
//  XMGAddViewController.m
//  小码哥通讯录
#import "XMGAddViewController.h"
#import "XMGContact.h"

@interface XMGAddViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UITextField *phoneField;
@property (weak, nonatomic) IBOutlet UIButton *addBtn;

@end

@implementation XMGAddViewController

// 点击添加的时候调用
- (IBAction)add:(id)sender {
    // 0.把文本框的值包装成联系人模型
    XMGContact *c = [XMGContact contactWithName:_nameField.text phone:_phoneField.text];

    // 1.通知代理做事情
    // _delegate = _contactVc
    if ([_delegate respondsToSelector:@selector(addViewController:didClickAddBtnWithContact:)]) {
        [_delegate addViewController:self didClickAddBtnWithContact:c];
    }

    // 2.回到联系人控制器
    [self.navigationController popViewControllerAnimated:YES];

}

- (void)viewDidLoad {
    [super viewDidLoad];

    // 给文本框添加监听器,及时监听文本框内容的改变
    [_nameField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
    [_phoneField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];

}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    // 主动弹出姓名文本框
    [_nameField becomeFirstResponder];
}

// 任一一个文本框的内容改变都会调用
- (void)textChange
{
    _addBtn.enabled = _nameField.text.length && _phoneField.text.length;

}

@end
时间: 2024-10-12 12:24:30

03-0612-私人通讯录通讯录(代理解耦)的相关文章

iOS分组通讯录效果+側滑菜单(MMDrawerController)

前言的废话-能够忽略 自从学会了使用Cocoapod,就欲罢不能了!由于太简单太赞了,不用再把源代码粘到project里了! 參见戴维营博客中的解说:Cocoapod 安装以及使用 先上一下效果图,请原谅我手残录的效果不是非常理想,大致就是这个意思 接下来上代码! 1.通讯录 通讯录基本的就是建立索引栏和section的关联,其次是初始化索引栏数据和每一个section的title.关于索引栏数据,假设写接口的小哥人好的话就会直接帮你返回ABCD-假设非常不幸,接口小哥不给你返回索引栏数据,那就

用c语言多文件编写1000人的通讯录

实现一个通讯录: 通讯录可以用来存储1000个人的信息,每个人的信息包括: 姓名,性别,年龄,电话,住址 提供方法: 1:                 添加联系人信息 2:                 删除指定联系人信息 3:                 查找指定联系人信息 4:                 修改指定联系人信息 5:                 显示所有联系人信息 6:                 清空所有联系人 #ifndef __CONTACT_H_

iOS 代理传值(逆传)

休息够了,该写点东西了,前一段时间感冒,发烧,扁桃体发炎,发烧,扁桃体再次发炎,再次发烧,够够的了,进入正题,这次主题是通过代理来实现传值,是逆传,就是反方向传值(废话),准备工作的是,有两个控制器,每个控制器上有两个控件,一个是Button(用来实现控制器之间的跳转),一个是Label(用来展示要传递的值和传递过来的值),代理传值很实用,很多时候用代理解耦,不过代码量也不少: 基本原理:有控制器A,控制器B,代理C,当B快要死的时候找了代理C,说:我快死了,你把我这点遗产给A送过去,我是没机会

好程序员Java教程Java动态代理机制详解

好程序员Java教程Java动态代理机制详解:在java的动态代理机制中,有两个重要的类或接口,一个是 InvocationHandler(Interface).另一个则是 Proxy(Class),这一个类和接口是实现我们动态代理所必须用到的.首先我们先来看看java的API帮助文档是怎么样对这两个类进行描述的: InvocationHandler: 1InvocationHandler is the interface implemented by the invocation handle

转:QT 的点点滴滴 错误总结

转自:http://blog.csdn.net/lbsljn/archive/2009/12/29/5099590.aspx MinGw + CodeBlock + QT4.5 类定义后面要加";" 函数的实现部分,如果定义部分有void,则实现部分不能少; 检查include文件有无少; error: request for member `show' in `((MainWindow*)this)->MainWindow::rightform', which is of no

QT 错误集1

MinGw + CodeBlock + QT4.5 类定义后面要加";" 函数的实现部分,如果定义部分有void,则实现部分不能少; 检查include文件有无少; error: request for member `show' in `((MainWindow*)this)->MainWindow::rightform', which is of non-class type `RightForm*'|"->"与"."问题 函数&

微信公众号推广一些常用方法和Dd_g自己使用的一些偏门的方法

前面21条方法都是网上到处有的,常用的一些方法.最后我还分享了小编自己的一些偏门的方法. 一.合作互推 虽然是微博上的玩法,但据称效果还不错!这也是最好最快的方法.微信互推的效果远比微博互推的效果好.先做到1000粉丝后开始找人合作互推,每次效果好都会获得上百的粉丝.所以做微信合作也很重要. 但需要切记的是,这种方法可在微博上互推,但微信上需谨慎,一旦被举报,有可能被封号.因此同一个合作伙伴的互推次数需谨慎,搞得不好容易扯到蛋. 二.微博图片推广 这种方式最守得住节操,不管是个人微博小号还是官方

十大微信推广办法

微信账号不同,推广方式不同,比如明星账号.企业账号.草根账号,适合的推广方法都不太一样,有的人有时间.有的人会用软件.有的人有强大的线上或线下资源.有的人擅长传统推广模式,关键是都试试,然后找到一些适合自己推广的方法. 第一招 内容为王 靠好的内容产生口碑自然增长 现在很多公众号是可以实现自然增粉的,每天增加几十个甚至上百个粉丝都是有的.如何实现自然增长呢?1.  取一个好的名字,重点是名字中的关键字,2.  做好签名,设置好诱导的个性签名.然后查看附近的人,你就可以被别人看到,如果你的签名吸引

微信好友协助解封登录 微信自助解封操作失败原因

01 翻开最新版的微信. ? 02 输入手机账号以及暗码进行登录. 03 好点击通讯录 04 屏幕下滑,找到微信团队,这个微信团队也是微信平台默许增加的. 05 点击发送音讯 06 点击左下角的自助工具,点击辅佐验证 07 在这里会有老友的辅佐验证恳求音讯,如果有的话,点击断定即可帮助老友解封. 原文地址:https://www.cnblogs.com/sss777/p/9747814.html