【问题标题】:Making UITextField from another class resign first responder让另一个类的 UITextField 辞职第一响应者
【发布时间】:2013-03-25 01:32:33
【问题描述】:

我有一个应用程序,它有一个使用自定义单元格的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

【问题讨论】:

    标签: iphone ios uitextfield resignfirstresponder


    【解决方案1】:

    只需致电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;
    }
    

    【讨论】:

    • 您好,感谢您的解决方案。我有这个在另一个应用程序上工作,但我似乎无法让它在这个应用程序上工作。我到底应该在哪里写这段代码?谢谢!
    • 顺便说一句,我在故事板中添加了我的UITextField
    【解决方案2】:

    我使用的一个粗略但有效的实现是创建一个新的 UITextField,将其设置为第一响应者,然后立即将其删除。执行此操作(在视图内)的基本方法是执行以下操作:

    UITextField *cell = [UITextField new];
    [self addSubview:cell];
    
    [cell becomeFirstResponder];
    [cell resignFirstResponder];
    
    [cell removeFromSuperview];
    cell = nil;
    

    这将创建一个新单元格,将其添加到视图中以便可以选择它,使其将键盘的焦点从当前选定的单元格上移开,隐藏键盘,然后删除新单元格。

    编辑:如果您之后要将另一个文本字段设置为第一响应者,则完全不需要此代码。然后,您只需在新文本字段上调用 ​​becomeFirstResponder,键盘焦点就会自动转移。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多