牛逼,点击空白处回收键盘,设置view的大小,视图控制器(特别重要)

<span style="font-size:24px;">#import "AppDelegate.h"
#import "RootViewController.h"
@implementation AppDelegate</span>
<span style="font-size:24px;">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    //<span style="background-color: rgb(51, 204, 255);">采用抽象工厂设计模式</span>:
    //提供一个抽象的基类(提供基本的功能),适用时使用具体的子类
    //比如UIView,UIViewController都是抽象的基类
    //1.创建视图控制器对象
    RootViewController *rootVC = [[RootViewController alloc] init];
    //2.指定为window的根视图控制器
    self.window.rootViewController = rootVC;
    //3.释放所有权
    [rootVC release];
    self.window.backgroundColor = [UIColor whiteColor];
    [self.window makeKeyAndVisible];
    return YES;
-(void)dealloc
{
    [_window release];
    [super dealloc];
}#import "RootViewController.h"
#import "loginView.h"
@interface RootViewController ()

@end

@implementation RootViewController
<span style="background-color: rgb(51, 204, 255);">//initWithNibName:bundle:初始化方法为指定初始化方法,不管调用该类哪一个初始化方法</span>,该方法都会被调用
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        //self.view;//创建视图不要放在这里,因为还没有初始化,但是调用方法的是视图控制器的对象,会影响程序运行
    }
    return self;
}
//当访问控制器的view时,如果view为空,还没有创建(为视图控制器创建),会调用loadView方法,为视图控制器创建view。
//当执行玩loadView之后,就会立即执行viewDidLoad。

//父类对loadView方法的实现,是创建一个和大屏幕大小一样的view
#pragma mark - loadView
- (void)loadView
{
    //[super loadView];//父类对loadView方法的实现就是创建了一个UIView类型的对象,并且作为控制器的view
    
    //将loginView视图对象指定为视图控制器的view;
    //创建登录界面
    loginView *lgView = [[loginView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];//不管frame为多少,在运行的时候系统都会指定view的frame为全屏幕
    [lgView.useBtn addTarget:self action:@selector(login:) forControlEvents:UIControlEventTouchUpInside];
    //设置textField代理
    lgView.useTF.delegate = self;
    //点击空白区域键盘回收
    lgView.backgroundColor = [UIColor redColor];
    //将lgView指定为视图控制器的view
    self.view = lgView;//调用setter方法
    [lgView release];
}
- (void)login:(UIButton *)btn
{
    NSLog(@"点击了");
}
<span style="background-color: rgb(102, 102, 204);">//回收键盘也在这里</span>
#pragma mark - textFieldShouldReturn
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}
/**
 *  <span style="background-color: rgb(102, 102, 204);">视图控制器来分担AppDelegate的任务</span>,管理子视图,所以也要一个类似于containewView的视图来管理子视图,所以对于视图控制器自身就带着一个view,大小和屏幕大小相同,通过 self.view访问控制器的额view。
    视图控制器不是视图,在屏幕上时看不到的,只要在屏幕上能看到的东西都是视图.
 */
//<span style="background-color: rgb(153, 153, 255);">当视图控制器的视图加载完成后触发.(只要loadView方法被调用之后,就会立即调用viewDidLoad方法)</span>
//只是视图view创建完毕,但是此时视图还没有添加到父视图上
#pragma mark - viewDidLoad
- (void)viewDidLoad
{
    [super viewDidLoad];
    //self.view.backgroundColor = [UIColor greenColor];//这里的view相当于containewView
}
//当重写父类方法时,如果不知道父类方法对该方法是如何实现的,当自己在实现时,先调用父类对该方法的实现
//当视图控制器的view布局自身的子视图的时候,该方法就会被触发。(视图控制器的view将要显示上边的子视图时触发),<span style="background-color: rgb(204, 102, 204);">可以设置view在总屏幕上的大小
- (void)viewWillLayoutSubviews//layout:布局
{
    [super viewWillLayoutSubviews];
    NSLog(@"%@", self.view.superview);
    self.view.frame = CGRectMake(0, 200, 320, 400);
}</span>
/**
 *  <span style="background-color: rgb(255, 204, 255);">当应用程序收到内存警告(当内存吃紧,内存不足)时触发,释放一些暂时不使用(该资源已经分配)的系统资源,供当前程序运行</span>
 */
- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
}
//<span style="background-color: rgb(102, 102, 204);">点击view的空白处回收键盘
-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    //让键盘回收
    loginView *lgView = (loginView *)self.view;
    [lgView.useTF resignFirstResponder];
}</span>
#import <UIKit/UIKit.h>

@interface loginView : UIView
/**
 *  <span style="background-color: rgb(153, 153, 255);">将控件定义成属性,给外界提供访问的接口</span>
 */
@property (nonatomic, retain) UILabel *useLabel;
@property (nonatomic, retain) UITextField *useTF;
@property (nonatomic, retain) UIButton *useBtn;
@end
#import "loginView.h"
#define k_color whiteColor
@implementation loginView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code
        //封装控件
        self.useLabel = [[UILabel alloc] initWithFrame:CGRectMake(20, 100, 80, 40)];
        _useLabel.text = @"用户名";
        _useLabel.layer.cornerRadius = 6;
        _useLabel.layer.masksToBounds = YES;
        _useLabel.backgroundColor = [UIColor k_color];
        _useLabel.textAlignment = NSTextAlignmentLeft;
        [self addSubview:_useLabel];
        [_useLabel release];
       self.useTF = [[UITextField alloc] initWithFrame:CGRectMake(130, 100, 150, 40)];//使用点语法作用:将所有权保留了一份,内存优化,能使用点语法就使用点语法
        [self addSubview:_useTF];
        _useTF.textAlignment = NSTextAlignmentLeft;
        _useTF.placeholder = @"请输入用户名";
        _useTF.borderStyle = UITextBorderStyleRoundedRect;
        _useTF.backgroundColor = [UIColor k_color];
        
        [_useTF release];
        self.useBtn = [UIButton buttonWithType:UIButtonTypeSystem];
        _useBtn.frame = CGRectMake(50, 200, 220, 40);
        [_useBtn setTitle:@"登录" forState:UIControlStateNormal];
        _useBtn.backgroundColor = [UIColor k_color];
       <span style="background-color: rgb(51, 102, 255);"> //这里不写button添加点击事件,是因为我们只想让loginView具有一个显示的功能(view本来就只有显示的功能),如果添加点击事件,则它就不仅仅是有了一个显示的功能,也有了处理点击事件的功能,对点击事件做出响应,而controller控件是帮助applacation完成任务的,干活都让控件controller控件去干</span>
        [self addSubview:_useBtn];
    }
    return self;
}
-(void)dealloc
{
    [_useLabel release];
    [_useTF release];
    [_useBtn release];
    [super dealloc];
}
</span>

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值