Заставить UITextField из другого класса отказаться от первого ответчика

У меня есть приложение, в котором есть UITableView, использующее пользовательские ячейки, для которых я создал новый класс CustomCell. Новая ячейка создается каждый раз при нажатии определенной кнопки, и каждая ячейка имеет UITextField. Я хочу знать, как заставить UITextField в ячейке уйти в отставку первым ответившим после того, как я нажму на нее. Имейте в виду, что он инициализируется в другом классе с именем CustomCell.

UIViewController код:

- (void)viewDidLoad
{
    [super viewDidLoad];

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]
                                   initWithTarget:self
                                   action:@selector(dismissKeyboard)];

    [self.view addGestureRecognizer:tap];
}
-(void)dismissKeyboard{

    }
 (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{


    static NSString *CellIdentifier= @"Cell";

    CustomCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[CustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"Cell"];
    }
    if (indexPath.row%2==0){

        n=1;

        cell.inOut.text = [NSString stringWithFormat:@"Entrada %d:", indexPath.row/2 +1];

        cell.entryTime.text = [NSString stringWithFormat:@"%@", [_entryArray objectAtIndex:(indexPath.row+2)]];


        if (indexPath.row==0){
            cell.delta.text=@"";
        }
        else {
            cell.delta.text = [_timeSinceLastEntryArray objectAtIndex:indexPath.row];
        }
    }
    else{
        cell.inOut.text = [NSString stringWithFormat:@"Saída %d:", (indexPath.row+1)/2];
        cell.entryTime.text = [NSString stringWithFormat:@"%@",[_entryArray objectAtIndex:(indexPath.row+2)]];

        cell.delta.text = [_timeSinceLastEntryArray objectAtIndex:indexPath.row];
        if (whichButton==YES){}
        else{
            }
        n=2;

    }
    if( [indexPath row] % 2)
        [cell setBackgroundColor:[UIColor whiteColor]];
    else
        [cell setBackgroundColor:[UIColor lightGrayColor]];



    return cell;
}

CustomCell.h код:

@interface CustomCell : UITableViewCell 

@property (strong, nonatomic) IBOutlet UITextField *inOut;

@property (strong, nonatomic) IBOutlet UILabel *entryTime;
@property (strong, nonatomic) IBOutlet UILabel *delta;

- (void) dismissInOutKeyboard;

@end

CustomCell.m код:

@implementation CustomCell

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
    if (self) {
        _inOut = [[UITextField alloc]init];




        _entryTime = [[UILabel alloc]init];

        _delta = [[UILabel alloc]init];

        [self.contentView addSubview:_entryTime];

        [self.contentView addSubview:_inOut];

        [self.contentView addSubview:_delta];

    }
    return self;
}

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];

    // Configure the view for the selected state
}

@synthesize  inOut=_inOut, entryTime=_entryTime, delta=_delta;
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {

    if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {

        // Initialization code

        _inOut = [[UITextField alloc]init];

        _inOut.textAlignment = UITextAlignmentLeft;


        _entryTime = [[UILabel alloc]init];

        _entryTime.textAlignment = UITextAlignmentLeft;


        _delta = [[UILabel alloc]init];

        _delta.textAlignment = UITextAlignmentLeft;

        [self.contentView addSubview:_entryTime];

        [self.contentView addSubview:_inOut];

        [self.contentView addSubview:_delta];

    }

    return self;

}



@end

person dietbacon    schedule 25.03.2013    source источник


Ответы (2)


Просто вызовите findAndResignFirstResponder для самого верхнего представления, которое у вас есть, т.е. UIViewController.view

Декларация:

@interface UIView (findAndResignFirstResponder)
- (void)findAndResignFirstResponder;
- (UIView *)findFirstResponder;
@end

Определение:

@implementation UIView (findAndResignFirstResponder)
- (void)findAndResignFirstResponder {
    [self.findFirstResponder resignFirstResponder];
}

- (UIView *)findFirstResponder {
    for (UIView *subView in self.subviews) {
        if (subView.isFirstResponder)
            return subView;
        UIView* firstResponder = subView.findFirstResponder;
        if(firstResponder)
            return firstResponder;
    }
    return nil;
}
person Nikolay Mikhaylov    schedule 25.03.2013
comment
Привет, спасибо за решение. У меня это работало в другом приложении, но я не могу заставить его работать в этом. Где именно я должен написать этот код? Благодарность! - person dietbacon; 09.04.2013
comment
Кстати, я добавляю свой UITextField в раскадровку - person dietbacon; 09.04.2013

Одна грубая, но работающая реализация, которую я использовал, состоит в том, чтобы создать новый UITextField, установить его в качестве первого ответчика, а затем немедленно удалить. Основной способ сделать это (в представлении) состоит в том, чтобы сделать что-то вроде этого:

UITextField *cell = [UITextField new];
[self addSubview:cell];

[cell becomeFirstResponder];
[cell resignFirstResponder];

[cell removeFromSuperview];
cell = nil;

Это создает новую ячейку, добавляет ее в представление, чтобы ее можно было выбрать, отводит фокус клавиатуры от текущей выбранной ячейки, скрывает клавиатуру, а затем удаляет новую ячейку.

Изменить: если вы собираетесь установить другое текстовое поле в качестве первого ответчика, этот код совершенно не нужен. Затем вам просто нужно будет вызвать becomeFirstResponder в новом текстовом поле, и фокус клавиатуры автоматически сместится.

person Glenn Smith    schedule 25.03.2013