zoukankan      html  css  js  c++  java
  • 03通讯录(搭建编辑界面)

    //
    //  XMGContactViewController.h
    //  小码哥通讯录
    
    #import <UIKit/UIKit.h>
    @class XMGContact;
    @interface XMGContactViewController : UITableViewController
    
    @end
    //
    //  XMGContactViewController.m
    //  小码哥通讯录//
    #import "XMGContactViewController.h"
    #import "XMGAddViewController.h"
    #import "XMGEditViewController.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;
        
    }
    
    #pragma mark - 添加控制器代理方法
    - (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];
        
    //    // 取消分割线
    //    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        
        // tableView有数据的时候才需要分割线
        
        // 开发小技巧:快速取消分割线
        self.tableView.tableFooterView = [[UIView alloc] init];
        
    }
    
    #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;
    }
    
    
    #pragma mark - tableView代理方法
    // 点击cell的时候调用
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 加载storyboard
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        
        
        // 创建编辑控制器
         XMGEditViewController *editVc = [storyboard instantiateViewControllerWithIdentifier:@"edit"];
        
        
        editVc.contact = self.contacts[indexPath.row];
        
        // 跳转到编辑界面
        [self.navigationController pushViewController:editVc animated:YES];
        
    }
    @end
    //
    //  XMGEditViewController.h
    //  小码哥通讯录
    
    #import <UIKit/UIKit.h>
    
    @class XMGContact;
    
    @interface XMGEditViewController : UIViewController
    
    @property (nonatomic, strong) XMGContact *contact;
    
    @end
    //
    //  XMGEditViewController.m
    //  小码哥通讯录
    #import "XMGEditViewController.h"
    #import "XMGContact.h"
    
    @interface XMGEditViewController ()
    @property (weak, nonatomic) IBOutlet UITextField *nameField;
    @property (weak, nonatomic) IBOutlet UITextField *phoneField;
    @property (weak, nonatomic) IBOutlet UIButton *saveBtn;
    
    @end
    
    @implementation XMGEditViewController
    
    /*
     控制器之间传值:一定要注意控制器的子控件有没有加载,一定要在子控件加载完成的时候才去给子控件赋值,一般在viewDidLoad给控件赋值。
     
     */
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        // 设置导航条的标题
        self.title = @"查看/编辑界面";
        
        // 设置导航条右边的按钮
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"编辑" style:UIBarButtonItemStyleDone target:self action:@selector(edit:)];
        
        
        // 给文本框
        _nameField.text = _contact.name;
        _phoneField.text = _contact.phone;
    
        // 给文本框添加监听器,及时监听文本框内容的改变
        [_nameField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
        [_phoneField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
        
        
        // 判断下登录按钮能否点击
        [self textChange];
        
    }
    
    // 任一一个文本框的内容改变都会调用
    - (void)textChange
    {
        _saveBtn.enabled = _nameField.text.length && _phoneField.text.length;
    
    }
    
    
    // 点击编辑的时候调用
    - (void)edit:(UIBarButtonItem *)item
    {
        NSLog(@"%@",item);
        
        if ([item.title isEqualToString:@"编辑"]) {
            // 更改标题
            item.title = @"取消";
            
            // 让文本框允许编辑
            _nameField.enabled = YES;
            _phoneField.enabled = YES;
            
            // 弹出电话文本框的键盘
            [_phoneField becomeFirstResponder];
            
            // 显示保存按钮
            _saveBtn.hidden = NO;
            
           
        }else{
            // 更改标题
            item.title = @"编辑";
            
    //        // 退出键盘
    //        [self.view endEditing:YES];
            
            // 隐藏保存按钮
            _saveBtn.hidden = YES;
            
            // 让文本框不允许编辑
            _nameField.enabled = NO;
            _phoneField.enabled = NO;
        }
       
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    @end

    小码哥通讯录(保存功能)

    //
    //  XMGEditViewController.h
    //  小码哥通讯录
    
    #import <UIKit/UIKit.h>
    
    @class XMGContact;
    
    // 定义block类型别名
    typedef void(^XMGEditViewControllerBlock)();
    
    @interface XMGEditViewController : UIViewController
    
    @property (nonatomic, strong) XMGContact *contact;
    
    @property (nonatomic, strong) XMGEditViewControllerBlock block;
    
    @end
    //
    //  XMGEditViewController.m
    //  小码哥通讯录
    #import "XMGEditViewController.h"
    #import "XMGContact.h"
    
    @interface XMGEditViewController ()
    @property (weak, nonatomic) IBOutlet UITextField *nameField;
    @property (weak, nonatomic) IBOutlet UITextField *phoneField;
    @property (weak, nonatomic) IBOutlet UIButton *saveBtn;
    
    @end
    
    @implementation XMGEditViewController
    // 点击保存的时候调用
    - (IBAction)save:(id)sender {
        // 修改模型数据
        _contact.name = _nameField.text;
        _contact.phone = _phoneField.text;
        
    #warning TODO:
        // 让小弟做事情,刷新表格
        if (_block) {
            
            _block();
        }
        
        
        // 回到上一个控制器
        [self.navigationController popViewControllerAnimated:YES];
        
    }
    
    /*
     控制器之间传值:一定要注意控制器的子控件有没有加载,一定要在子控件加载完成的时候才去给子控件赋值,一般在viewDidLoad给控件赋值。
     
     */
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
        
        // 设置导航条的标题
        self.title = @"查看/编辑界面";
        
        // 设置导航条右边的按钮
        self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"编辑" style:UIBarButtonItemStyleDone target:self action:@selector(edit:)];
        
        
        // 给文本框
        _nameField.text = _contact.name;
        _phoneField.text = _contact.phone;
    
        // 给文本框添加监听器,及时监听文本框内容的改变
        [_nameField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
        [_phoneField addTarget:self action:@selector(textChange) forControlEvents:UIControlEventEditingChanged];
        
        
        // 判断下登录按钮能否点击
        [self textChange];
        
    }
    
    // 任一一个文本框的内容改变都会调用
    - (void)textChange
    {
        _saveBtn.enabled = _nameField.text.length && _phoneField.text.length;
    
    }
    
    
    // 点击编辑的时候调用
    - (void)edit:(UIBarButtonItem *)item
    {
        NSLog(@"%@",item);
        
        if ([item.title isEqualToString:@"编辑"]) {
            // 更改标题
            item.title = @"取消";
            
            // 让文本框允许编辑
            _nameField.enabled = YES;
            _phoneField.enabled = YES;
            
            // 弹出电话文本框的键盘
            [_phoneField becomeFirstResponder];
            
            // 显示保存按钮
            _saveBtn.hidden = NO;
            
           
        }else{
            // 更改标题
            item.title = @"编辑";
            
    //        // 退出键盘
    //        [self.view endEditing:YES];
            
            // 隐藏保存按钮
            _saveBtn.hidden = YES;
            
            // 让文本框不允许编辑
            _nameField.enabled = NO;
            _phoneField.enabled = NO;
            
            // 还原数据
            _nameField.text = _contact.name;
            _phoneField.text = _contact.phone;
        }
       
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    
    /*
    #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
    //
    //  XMGContactViewController.m
    //  小码哥通讯录
    #import "XMGContactViewController.h"
    #import "XMGAddViewController.h"
    #import "XMGEditViewController.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;
        
    }
    
    #pragma mark - 添加控制器代理方法
    - (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];
        
    //    // 取消分割线
    //    self.tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
        
        // tableView有数据的时候才需要分割线
        
        // 开发小技巧:快速取消分割线
        self.tableView.tableFooterView = [[UIView alloc] init];
        
    }
    
    #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;
    }
    
    
    #pragma mark - tableView代理方法
    // 点击cell的时候调用
    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    {
        // 加载storyboard
        UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
        
        
        // 创建编辑控制器
         XMGEditViewController *editVc = [storyboard instantiateViewControllerWithIdentifier:@"edit"];
        
        
        editVc.contact = self.contacts[indexPath.row];
        editVc.block = ^(){ // 刷新表格
            [self.tableView reloadData];
        };
        
        // 跳转到编辑界面
        [self.navigationController pushViewController:editVc animated:YES];
        
    }
    @end
    本人无商业用途,仅仅是学习做个笔记,特别鸣谢小马哥,学习了IOS,另日语学习内容有需要文本和音频请关注公众号:riyuxuexishuji
  • 相关阅读:
    Cordova插件:InAppBrowser
    Redux入门学习
    【转】浅谈React、Flux 与 Redux
    .Net学习难点讨论系列17
    《集体智慧编程》读书笔记4
    《集体智慧编程》读书笔记3
    《集体智慧编程》读书笔记2
    《集体智慧编程》读书笔记1
    C#与C++的发展历程第四
    C#与C++的发展历程第三
  • 原文地址:https://www.cnblogs.com/laugh/p/6649791.html
Copyright © 2011-2022 走看看