私人通讯录

2.功能说明


(1).只有当账号和密码输入框都有值的时候,登录按钮才能交互

(2).当取消勾选记住密码后,自动登录按钮也随之取消;当勾选了自动登录按钮时,记住密码按钮也一同勾选。

(3).点击登陆后,弹出蒙版,界面不可交互,程序能够简单判断账号和密码是否正确,如果不正确则给出相应的提示,如果正确则跳转到联系人列表界面。


二、实现过程和代码
3.简单介绍
三、segue的使用

Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue)

2.segue的三个属性

每一个Segue对象,都有3个属性

唯一标识   @property (nonatomic, readonly) NSString *identifier;

来源控制器   @property (nonatomic, readonly) id sourceViewController;


目标控制器   @property (nonatomic, readonly) id destinationViewControlle

2.segue的两种类型

根据Segue的执行(跳转)时刻,Segue可以分为2大类型

自动型: 点击某个控件后(比如按钮),自动执行Segue,自动完成界面跳转


按住Control键,直接从控件拖线到目标控制器。 点击“登录”按钮后,就会自动跳转到右边的控制器。如果点击某个控件后,不需要做任何判断,一定要跳转到下一个界面,建议使用“自动型Segue”

在恰当的时刻,使用perform方法执行对应的Segue     [self performSegueWithIdentifier:@"login2contacts" sender:nil];   

Segue必须由来源控制器来执行,也就是说,这个perform方法必须由来源控制器来调用。如果点击某个控件后,需要做一些判断,也就是说:满足一定条件后才跳转到下一个界面,建议使用“手动型Segue”


3. performSegueWithIdentifier:sender:

利用 performSegueWithIdentifier: 方法可以执行某个Segue,完成界面跳转

4.performSegueWithIdentifier:sender: 方法的完整执行过程

[ self performSegueWithIdentifier : @“login2contacts” sender : nil ];

(1)根据identifier去storyboard中找到对应的线,新建UIStoryboardSegue对象

设置Segue对象的sourceViewController(来源控制器)

新建并且设置Segue对象的destinationViewController(目标控制器)

(2)调用sourceViewController的下面方法,做一些跳转前的准备工作并且传入创建好的Segue对象

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender;

// 这个 sender 是当初 performSegueWithIdentifier:sender: 中传入的 sender

(3)调用Segue对象的 - ( void )perform; 方法开始执行界面跳转操作

取得sourceViewController所在的UINavigationController


调用UINavigationController的push方法将destinationViewController压入栈中,完成跳转



1.自动是按钮练习不需要做任何判断.(适合不要做判断用)
2.手动得是控制器连过去,,得定义一个标示 然后加入一个方法

2.顺传
控制器之间的数据传递主要有2种情况:顺传和逆传
顺传
控制器的跳转方向: A C
数据的传递方向    : A C
数据的传递方式    :  在AprepareForSegue:sender:方法中根据segue参数取得destinationViewController, 也就是控制器C, 直接给控制器C传递数据
(要在CviewDidLoad方法中取得数据,来赋值给界面上的UI控件)
3.逆传
逆传
控制器的跳转方向: A C
数据的传递方向    : C A
数据的传递方式    :  让A成为C的代理, C中调用A的代理方法,通过代理方法的参数传递数据给A

1.布置界面

2.设置第三方框架

3.是否允许text允许用户编辑
/ 是否允许用户编辑
   
//- (BOOL)textFieldShouldBeginEditing:(UITextField*)textField
   
//{
   
//    NSLog(@"%@", self.usernameField.text);
   
//    return YES;
    //}
4.文本开始编辑的时候调用
// became first responder
   
// 文本框开始编辑的时候调用
   
//- (void)textFieldDidBeginEditing:(UITextField*)textField{
   
//    NSLog(@"%@", self.usernameField.text);
    //}
5.是否允许结束编辑

// 是否允许结束编辑
   
//- (BOOL)textFieldShouldEndEditing:(UITextField*)textField
   
//{
   
//    NSLog(@"%@", self.usernameField.text);
   
//    return YES;
    //}
6.文本框已经结束编辑的时候调用

// 文本框已经结束编辑的时候调用
    //- (void)textFieldDidEndEditing:(UITextField *)textField{
   
//     NSLog(@"%@", self.usernameField.text);
    //}
7.是否允许更该文本框的值

    // 是否允许更改文本框的值
   
//- (BOOL)textField:(UITextField*)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString*)string
   
//{
   
//    NSLog(@"%@", self.usernameField.text);
   
//    return YES;
    //}

8.UIActionsheet ,ios8以后过期了,但是还是可以用的

- ( IBAction )logout:( id )sender
{
   
UIActionSheet * sheet = [[ UIActionSheet alloc ] initWithTitle : @" 你确定要注销嘛 ?" delegate : self cancelButtonTitle : @" 取消 " destructiveButtonTitle : @" 注销 " otherButtonTitles : nil , nil ];
    [sheet
showInView : self . view ];
}

// actionSheet的点击事件 buttonIndex 从上到下 0依次递增
- (
void )actionSheet:( UIActionSheet *)actionSheet clickedButtonAtIndex:( NSInteger )buttonIndex
{
   
NSLog ( @"%ld" , buttonIndex);
   
if (buttonIndex == 0 ) {
       
dispatch_after ( dispatch_time ( DISPATCH_TIME_NOW , ( int64_t )( 0.25 * NSEC_PER_SEC )), dispatch_get_main_queue (), ^{
           
// 注销
            [
self . navigationController popViewControllerAnimated : YES ];
        });
    }
}
9. 获取目标控制器
// 通过 segue 获取目标控制器
- (
void )prepareForSegue:( UIStoryboardSegue *)segue sender:( id )sender
{

   
// 获取目标控制器
   
UIViewController * vc = segue. destinationViewController ;
   
// 判断类型
   
if ([vc isKindOfClass :[ AddViewController class ]]) {
       
// add
       
AddViewController * add = ( AddViewController *)vc;
        add.
delegate = self ;
    }
   
else {
       
// edit
       
EditViewController * edit = ( EditViewController *)vc;
        edit.
delegate = self ;
       
// 获取点击 tableview cell 的位置 (indexpath)
       
NSIndexPath * path = [ self . tableView indexPathForSelectedRow ];
       
Contact * con = self . contacts [path. row ];
        edit.
contact = con;
    }
}

10.默认让键盘弹出
    // 默认让键盘弹出
    [self.nameField becomeFirstResponder];

11.

   
if (! self . saveButton . hidden ) {
       
self . nameField . enabled = NO ;
       
self . numberField . enabled = NO ;
       
self . saveButton . hidden = YES ;
        sender.
title = @" 编辑 " ;

       
// 取消的时候 文本框的值 重新等于传过来的模型的数据
       
self . nameField . text = self . contact . name ;
       
self . numberField . text = self . contact . number ;
    }
   
else {
       
self . nameField . enabled = YES ;
       
self . numberField . enabled = YES ;
       
self . saveButton . hidden = NO ;
        sender.
title = @" 取消 " ;

       
// 光标放在电话上
        [
self . numberField becomeFirstResponder ];
    }
11.应用沙盒

每个iOS应用都有⾃己的应⽤沙盒(应用沙盒就是文件系统目录),与其他文件系统隔离。应⽤必须待在⾃己的沙盒里,其他应用不能访问该沙盒(提示:在IOS8中已经开放访问)



每个 iOS 应用都有自己的应用沙盒 ( 应用沙盒就是应用的文件夹 ) ,与其他文件系统隔离。应用必须待在自己的沙盒里,其他应用不能访问该沙盒
应用沙盒的文件系统目录,如下图所示(假设应用的名称叫Layer
12.结构分析
应用程序包: ( 上图中的 Layer) 包含了所有的资源文件和可执行文件
Documents
:保存应用运行时生成的 需要持久化的数据 iTunes 同步设备时 会备份 该目录。例如,游戏应用可将游戏存档保存在该目录

tmp
:保存应用运行时所需的 临时数据 ,使用完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。 iTunes 同步设备时 不会备份 该目录

Library/Caches
:保存应用运行时生成的 需要持久化的数据 iTunes 同步设备时 不会备份 该目录。一般存储体积大、不需要备份的非重要数据

Library/Preference:保存应用的所有偏好设置iOSSettings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
13.应用沙盒目录的常见获取方法
tmp NSString *tmp = NSTemporaryDirectory();

Library/Caches
( Documents 类似的 2 种方法 )
利用沙盒根目录拼接 ”Caches” 字符串
利用 NSSearchPathForDirectoriesInDomains 函数 ( 将函数的第 2 个参数改为: NSCachesDirectory 即可 )

Library/Preference:通过NSUserDefaults类存取该目录下的设置信息
13.属性列表 - 归档NSdictionary
将一个 NSDictionary 对象归档到一个 plist 属性列表中
// 将数据封装成字典
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
[dict setObject:@"
母鸡 " forKey:@"name"];
[dict setObject:@"15013141314" forKey:@"phone"];
[dict setObject:@"27" forKey:@"age"];
// 将字典持久化到 Documents/stu.plist 文件中
[dict writeToFile :path atomically:YES];

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值