私人通讯录

来源:互联网 发布:python可以写界面么 编辑:程序博客网 时间:2024/05/18 22:40
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 = [[UIActionSheetalloc]initWithTitle:@"你确定要注销嘛?"delegate:selfcancelButtonTitle:@"取消"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.navigationControllerpopViewControllerAnimated:YES];
        });
    }
}
9. 获取目标控制器
//通过segue获取目标控制器
- (
void)prepareForSegue:(UIStoryboardSegue*)segue sender:(id)sender
{

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

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

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.numberFieldbecomeFirstResponder];
    }
11.应用沙盒

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



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

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

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

Library/Preference:保存应用的所有偏好设置iOSSettings(设置)应用会在该目录中查找应用的设置信息。iTunes同步设备时会备份该目录
13.应用沙盒目录的常见获取方法
tmpNSString *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