IOS项目开发-密码生成器

PasswordGenerator

12/23/2014 4:45:15 PM. by Arbboter###


概要

通过仿密码生成器软件,练习IOS开发技术,加深对MVC设计模式的理解,对以前学习的点点滴滴复习+掌握。因为看到的例子是用拖拉界面实现的,
而为了实现和更好地学习IOS开发,我采用纯编码的方式来开发,所以相对拖拉会比较慢。例子里面虽然有专门的布局方法,但是没有处理屏幕方向发生变化时的事件,所以横屏还是有问题的。此外,对于每个界面都有一个对应的控制类,在UIView类里面实现UI元素的添加布局,在控制器里面实现事件、逻辑的处理,以便符合MVC的设计模式。

结果展示

主要技术点

  • 程序主要有两个界面:主页面(MainView)和帮助页面(InfomationView),这两个视图都是以程序的子视图的方式显示,两者互斥出现

  • 在主页面显示的时候,程序的根视图有一个信息按钮,通过该按钮可导航到帮助页面,而在帮助页面时,程序的根视图顶部有一个导航栏,通过导航栏的左右按钮都可以返回到主页面。

  • 页面切换时的动画采用UIView动画,其基本用法形如下所示:

      [UIView beginAnimations:nil context:nil];
      [UIView setAnimationDuration:1.0f];
      [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
      [self removeMainView];
      [UIView commitAnimations];
    
  • 一个UINavigationItem分为三部分:左按钮,标题文字,右按钮,主要用法形如:

      UINavigationBar* bar = [[UINavigationBar alloc] init];
      [self.view insertSubview:bar aboveSubview:self.infomationViewController.view];
      
      UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:@"About Password Generator"];
      [bar pushNavigationItem:item animated:YES];
      
      UIBarButtonItem* leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(SwitchView)];
      UIBarButtonItem* rightBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(SwitchView)];
      
      item.leftBarButtonItem = leftBarButton;
      item.rightBarButtonItem = rightBarButton;
    
  • 由于UIView的类里面初始化的时候只是添加了控件,而没有对控件的布局进行初始化,而布局初始化又是类方法里面的reLayout,所以为了保证显示前能够正确调用布局,我在视图对应类的控制器类里面重写了方法- (void) viewWillAppear:(BOOL)animated,在该方法里面调用了布局方法,如下所示:

      - (void) viewWillAppear:(BOOL)animated
      {
          if(self.autolayout)
          {
              [self.view reLayout];
          }
          [super viewWillAppear:animated];
      }
    
  • 由于经验不够,本来想想就能完成的事情做起来还是出现乱七八糟的问题,首先昨晚花了一个多小时一直写代码,然后测试,居然没有画面。调了下,不知道是什么原因。然后今天新建了个工程,一边写,一边看效果,零零散散,总算完成了。看来..不能一口吃成胖子,也不能光说不练。

主要代码

  1. 程序主控制器

     //
     //  ViewController.m
     //  PasswordGenerator
     //
     //  Created by arbboter on 14/12/23.
     //  Copyright (c) 2014ๅนด arbboter. All rights reserved.
     //
     
     #import "ViewController.h"
     #import "MainViewController.h"
     #import "InfomationViewController.h"
     
     @interface ViewController ()
     
     @property(nonatomic, retain) UIButton* infomationButton;
     @property(nonatomic, retain) MainViewController* mainViewController;
     @property(nonatomic, retain) InfomationViewController* infomationViewController;
     @property (nonatomic, retain) UINavigationBar* navagationBar;
     @end
     
     @implementation ViewController
     
     - (void)viewDidLoad
     {
         [super viewDidLoad];
         // Do any additional setup after loading the view, typically from a nib.
         
         [self SwitchView];
     }
     
     - (void) onInfomationView
     {
        
         InfomationViewController* viewController = [[InfomationViewController alloc] init];
         self.infomationViewController = viewController;
         [self.view addSubview:viewController.view];
         [viewController release];
         
         UINavigationBar* bar = [[UINavigationBar alloc] init];
         [self.view insertSubview:bar aboveSubview:self.infomationViewController.view];
         self.navagationBar = bar;
         [bar release];
         
         UINavigationItem* item = [[UINavigationItem alloc] initWithTitle:@"About Password Generator"];
         [bar pushNavigationItem:item animated:YES];
         UIBarButtonItem* leftBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStylePlain target:self action:@selector(SwitchView)];
         UIBarButtonItem* rightBarButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonItemStylePlain target:self action:@selector(SwitchView)];
         
         item.leftBarButtonItem = leftBarButton;
         item.rightBarButtonItem = rightBarButton;
         
         [item release];
         [leftBarButton release];
         [rightBarButton release];
     }
     
     - (void) removeInfomationView
     {
         [_infomationViewController.view removeFromSuperview];
         [_infomationViewController release];
         _infomationViewController = nil;
         
         [_navagationBar removeFromSuperview];
         [_navagationBar release];
         _navagationBar = nil;
     
     }
     
     - (void) SwitchView
     {
         [UIView beginAnimations:nil context:nil];
         [UIView setAnimationDuration:1.0f];
         
         if ([self.infomationButton superview])
         {
             [UIView setAnimationTransition:UIViewAnimationTransitionCurlUp forView:self.view cache:YES];
             [self removeMainView];
             [UIView commitAnimations];
             [self onInfomationView];
         }
         else
         {
             [UIView setAnimationTransition:UIViewAnimationTransitionCurlDown forView:self.view cache:YES];
             [self removeInfomationView];
             [UIView commitAnimations];
             [self onMainView];
         }
         [self reLayout];
     }
     
     - (void) removeMainView
     {
         [_infomationButton removeFromSuperview];
         [_infomationButton release];
         _infomationButton = nil;
         [_mainViewController.view removeFromSuperview];
         [_mainViewController release];
         _mainViewController = nil;
     }
     
     - (void) onMainView
     {
         UIButton* button = [UIButton buttonWithType:UIButtonTypeInfoDark];
         [self.view addSubview:button];
         [button addTarget:self action:@selector(SwitchView) forControlEvents:UIControlEventTouchUpInside];
         self.infomationButton = button;
         
         MainViewController* viewController = [[MainViewController alloc] init];
         [self.view insertSubview:viewController.view belowSubview:self.infomationButton];
         self.mainViewController = viewController;
         [viewController release];
     }
     
     - (void) reLayout
     {
         CGPoint origin = self.view.frame.origin;
         CGSize size = self.view.frame.size;
         
         CGFloat w = 40;
         CGFloat h = 40;
         CGFloat yMargin = 10;
         CGFloat xMargin = 10;
         CGFloat x = origin.x + size.width-2*xMargin-w;
         CGFloat y = origin.y + size.height - 2*yMargin - h;
         
         _navagationBar.frame = CGRectMake(origin.x, origin.y+20, size.width, 40);
         _infomationButton.frame = CGRectMake(x, y, w, h);
     }
     
     -(void) viewWillAppear:(BOOL)animated
     {
         [self reLayout];
         [super viewWillAppear:animated];
     }
     
     - (void)didReceiveMemoryWarning
     {
         [super didReceiveMemoryWarning];
         // Dispose of any resources that can be recreated.
     }
     
     - (void) dealloc
     {
         [self removeInfomationView];
         [self removeMainView];
         [super dealloc];
     }
     
     @end
    
  2. 帮助页面视图类

     //
     //  InfomationView.m
     //  PasswordGenerator
     //
     //  Created by arbboter on 14/12/23.
     //  Copyright (c) 2014年 arbboter. All rights reserved.
     //
     
     #import "InfomationView.h"
     
     @interface InfomationView ()
     
     @property (nonatomic, retain) UILabel* logoLabel;
     @property (nonatomic, retain) UIImageView* bkImageView;
     
     @end
     
     @implementation InfomationView
     
     - (id)init
     {
         self = [super init];
         if(self == nil)
         {
             return self;
         }
         
         UILabel* label = nil;
         label = [[UILabel alloc] init];
         label.text = @"Copyright (c) 2014年 arbboter.";
         label.textAlignment = NSTextAlignmentCenter;
         self.logoLabel = label;
         [self addSubview:label];
         [label release];
         
         UIImageView* imageView = [[UIImageView alloc] init];
         imageView.image = [UIImage imageNamed:@"bk.jpg"];
         imageView.contentMode = UIViewContentModeScaleAspectFit;
         self.bkImageView = imageView;
         [self insertSubview:imageView belowSubview:self.logoLabel];
         [imageView release];
         
         return self;
     }
     
     - (void) reLayout
     {
         CGPoint origin = self.frame.origin;
         CGSize size = self.frame.size;
         
         CGFloat yMargin = 10;
         CGFloat xMargin = 10;
         CGFloat w = size.width-2*xMargin;
         CGFloat h = 40;
         CGFloat x = origin.x + xMargin;
         CGFloat y = origin.y + size.height - 2*yMargin - h;
         
         _bkImageView.frame = self.frame;
         _logoLabel.frame = CGRectMake(x, y, w, h);
     
     }
     
     - (void) dealloc
     {
         [_bkImageView release];
         [_logoLabel release];
         [super dealloc];
     }
     @end
    

项目工程

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,914评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,935评论 2 383
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,531评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,309评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,381评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,730评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,882评论 3 404
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,643评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,095评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,448评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,566评论 1 339
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,253评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,829评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,715评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,945评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,248评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,440评论 2 348

推荐阅读更多精彩内容