码迷,mamicode.com
首页 > 其他好文 > 详细

UITableView中cell里的UITextField不被弹出键盘挡住

时间:2014-12-19 23:23:20      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

UITableView中cell里的UITextField不被弹出键盘挡住

技术分享

效果如下:

技术分享

源码:

EditCell.h 与 EditCell.m

//
//  EditCell.h
//  Cell
//
//  Created by YouXianMing on 14/12/18.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface EditCell : UITableViewCell

@property (nonatomic, strong) UITextField *field;

@end
//
//  EditCell.m
//  Cell
//
//  Created by YouXianMing on 14/12/18.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "EditCell.h"

@implementation EditCell

- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        UIView *line         = [[UIView alloc] initWithFrame:CGRectMake(0, 43, 320, 1)];
        line.backgroundColor = [UIColor colorWithRed:0.886 green:0.918 blue:0.933 alpha:1];
        [self addSubview:line];
        
        _field               = [[UITextField alloc] initWithFrame:CGRectMake(20, 2, 280, 42)];
        _field.textColor     = [UIColor grayColor];
        _field.font          = [UIFont fontWithName:@"HelveticaNeue-Thin" size:18];
        [self addSubview:_field];
    }
    
    return self;
}

@end

ViewController.m

//
//  ViewController.m
//  Cell
//
//  Created by YouXianMing on 14/12/18.
//  Copyright (c) 2014年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "EditCell.h"

static NSInteger number = 8;

@interface ViewController ()<UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate>

@property (nonatomic, strong) UITableView    *tableView;
@property (nonatomic, weak)   UITextField    *tmpTextField; // 获取当前编辑的TextField
@property (nonatomic, strong) NSMutableArray *strsArray;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    // 数据源(初始化)
    _strsArray = [NSMutableArray array];
    for (int i = 0; i < number; i++) {
        [_strsArray addObject:@""];
    }
    
    // 初始化tableView
    _tableView = [[UITableView alloc] initWithFrame:self.view.bounds
                                              style:UITableViewStylePlain];
    _tableView.backgroundColor = [UIColor colorWithRed:0.949 green:0.957 blue:0.961 alpha:1];
    [self.view addSubview:_tableView];
    
    _tableView.delegate       = self;
    _tableView.dataSource     = self;
    _tableView.separatorStyle = UITableViewCellSeparatorStyleNone;
    [_tableView registerClass:[EditCell class] forCellReuseIdentifier:@"YouXianMing"];
    
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return number;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    EditCell *cell      = [tableView dequeueReusableCellWithIdentifier:@"YouXianMing"];
    cell.field.delegate = self;
    cell.field.text     = _strsArray[indexPath.row];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    
    return cell;
}

#pragma mark - UITextField代理
- (void)textFieldDidBeginEditing:(UITextField *)textField {
    
    // 获取到临时的textField并存储起来
    self.tmpTextField = textField;
    
    // 获取到父类cell
    EditCell *cell    = (EditCell *)[self.tmpTextField superview];
    
    // 获取到indexPath
    NSIndexPath *path = [self.tableView indexPathForCell:cell];
    
    // 执行动画(移动到输入的位置)
    [self.tableView setContentOffset:CGPointMake(0, (path.row)*44) animated:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
    // 获取到临时的textField并存储起来
    self.tmpTextField = textField;
    
    // 获取到父类cell
    EditCell *cell    = (EditCell *)[self.tmpTextField superview];
    
    // 获取到indexPath
    NSIndexPath *path = [self.tableView indexPathForCell:cell];
    
    // 存储到数据源中
    [_strsArray replaceObjectAtIndex:path.row
                          withObject:(textField.text == nil ? @"" : textField.text)];
    
    // 打印信息
    NSLog(@"%@", _strsArray);
}
- (BOOL)textFieldShouldReturn:(UITextField *)sender {
    
    // 执行动画(恢复到原始位置)
    [self.tableView setContentOffset:CGPointMake(0, 0) animated:YES];
    
    // 交出第一响应者
    [sender resignFirstResponder];
    
    return YES;
}

@end

以下是需要注意的地方:

通过父视图获取到了cell,然后根据cell获取indexPath值,然后可以做事情了

技术分享

核心代码是根据第几个cell来执行位移的动画,这个值是可以调整的。

技术分享

 

UITableView中cell里的UITextField不被弹出键盘挡住

标签:

原文地址:http://www.cnblogs.com/YouXianMing/p/4174769.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!