2016-04-09 10 views
0

ラベルとテキストフィールドを持つシンプルなカスタムテーブルビューセルがあります。ストーリーボードには次のようになります。UITextFieldはtableviewcellでキーボードを表示します。

enter image description here

私は、ユーザーが、彼らはラベルをクリックした場合を含め、セル内の任意の場所にクリックしたときにキーボードを表示したいと思います。私はこれを達成する方法がセルがクリックされたときにbecomeFirstResponderを呼び出すことであると99%確信していました。

#import "ViewController.h" 

@interface ViewController() 
@property (weak, nonatomic) IBOutlet UITableView *tableView; 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.tableView.dataSource = self; 
    self.tableView.delegate = self; 

    [self.tableView setEstimatedRowHeight:44.0f]; 
    [self.tableView setRowHeight:UITableViewAutomaticDimension]; 
    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 1; 
} 

- (NSInteger) numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"custom"]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath]; 
    BOOL firstResponder = [cell becomeFirstResponder]; 

} 

そして、私のカスタムテーブルビューセル:ここ

は私の簡単なのViewControllerです

#import "CustomTableViewCell.h" 

@implementation CustomTableViewCell 

- (void)awakeFromNib { 
    [super awakeFromNib]; 
    // Initialization code 
} 

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

    // Configure the view for the selected state 
} 

- (BOOL) canBecomeFirstResponder { 
    return YES; 
} 

- (BOOL) becomeFirstResponder { 
    return [self.textField becomeFirstResponder]; 
} 

@end 

しかし私は、falseを返していること、becomeFirstResponderが呼び出されることを確認しました。私は何が欠けていますか?

答えて

1

アレックス-iがコメントhereで指摘@として考える:

この[テキストフィールドがファーストレスポンダになっていない]また、テキストフィールドが簡単に ビュー/ウィンドウ階層から削除されたときに発生する可能性がありますなりながら最初のレスポンダー(例えば、 は、UITableViewまたはUICollectionViewをリロードします。これは、 テキストフィールドを保持します)。

これは選択時に発生します。

はdidSelectRowAtIndexPathを使用するのではなく、あなたのようなアクションであなたのtableViewにUITapGestureRecognizerを追加することができます。

- (IBAction)tap:(UITapGestureRecognizer *)sender 
{ 
    CGPoint location = [sender locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location]; 
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath]; 
    BOOL firstResponder = [cell becomeFirstResponder]; 
} 

そして、それは最初の応答者となります。

0

誰かが迅速な代替手段を必要とする場合:外部UIViewをアウトレットコレクションと接続できます。各UIViewControllerクラスでは、一度以下の呼び出しを行います。外側のボックスに触れると、editfieldはキーボードでアクティブになります。これをラベルにも適用できます。

@IBOutlet var outerBoxes:[UIView]! 

override func viewDidLoad() { 
    super.viewDidLoad(); 
    for outerBox in outerBoxes { outerBox.respondForEditBox() }; 
... 

を(ラベルのユーザーの対話操作を無効にすることで)しかし、あなたは、このコードを持っている必要が一度:

Close iOS Keyboard by touching anywhere using Swift

で@ Esqarrouthの答えに触発さ
extension UIView { 
    func respondForEditBox() { 
     let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(UIView.focusOnEditBox)); 
     self.addGestureRecognizer(tap); 
    } 

    func focusOnEditBox() { 
     for sview in self.subviews { 
      if sview is UITextField { 
       sview.becomeFirstResponder(); 
      } 
     } 
    } 
} 

関連する問題