2

2 つの異なる customcell 定義を持つ UITableView があります。1 つは単一の UITextField で、もう 1 つは 4 つの UITextField です。

userInteractionEnabled は、セル レベルのタッチ ナビゲーションを有効にするように手動で設定され、関連するセルへの最初のレスポンダーへの didSelectRowAtIndexPath 内の UI インタラクションを処理します。

1 つの UITextField (editableTextField) で 1 つの customcell (EditableCustomCell) だけを使用していたとき、これはすべて正常に機能しましたが、今では 4 つの UITextField (度、分、秒、デカルト) を持つ customcell (LatLonCustomCell) があり、どのフィールドがbecomeFirstResponder を設定するために触れられました

(現在、デバッグ中に度と呼ばれる最初のテキストフィールドでデフォルト設定しています)

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{      
  [prevField resignFirstResponder];
  prevField.userInteractionEnabled = NO;

  if(indexPath.section == kFirstSection && (indexPath.row == kLatitudeRow || indexPath.row == kLongitudeRow)) {
    LatLonCustomCell *customCell = (LatLonCustomCell *)[MyTableView cellForRowAtIndexPath:indexPath];
    currField = customCell.degrees; // need to set correct field here
  } else {
    EditableCustomCell *customCell = (EditableCustomCell *)[MyTableView cellForRowAtIndexPath:indexPath];
    currField = customCell.editableTextField;
  }

  currFieldIndexPath = [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section];
  currField.userInteractionEnabled = YES;
  [currField becomeFirstResponder];

}

4

3 に答える 3

1

OK、同じまたは類似の問題でこれに遭遇した人のために、私はついに突破口を開きました

didSelectRowAtIndexPath が呼び出される前に、タッチの X/Y 座標をキャプチャする必要があると判断しました。このようにして、テキストフィールドの「境界」に対してタッチをチェックすることで、タッチが発生した UITextField を特定できました。

いくつかのランダムな検索の後、viewcontroller で任意のタッチ イベントをキャプチャする非常に簡単な方法を見つけました (touchesBegan はカスタム オーバーライドされた UITableViewCell クラスでのみ発生し、これをチェーンに戻す方法がわかりませんでした Cell > TableView > Scroll View >コントローラ)

これを viewDidLoad メソッドに追加することにより:

UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)];
tapGesture.numberOfTapsRequired = 1;
// Pass the tap through to the UITableView
tapGesture.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tapGesture];

これはすべてのタッチをキャプチャし、handleTapGestureメソッドを呼び出します

次に、このメソッド内では、タッチがテーブルビューの境界内にあるかどうかを確認するだけでした。そうであれば、タッチされたポイントの indexPath を決定し、必要なオブジェクトの境界に対してチェックします。以下は、私が思いついたこと

-(void)handleTapGesture:(UITapGestureRecognizer *)tapGesture {

  CGPoint tapLoc = [tapGesture locationInView:self.tableView];

  if([MyTableView indexPathForRowAtPoint:tapLoc]) {
    // Tap still handled by the UITableView delegate method

    NSIndexPath *indexPath = [MyTableView indexPathForRowAtPoint:tapLoc];

    if(indexPath.section == 0 && (indexPath.row == kLatitudeRow || indexPath.row == kLongitudeRow)) {
      LatLonCustomCell *customCell = (LatLonCustomCell *)[MyTableView cellForRowAtIndexPath:indexPath];
      UIScrollView *scrollView = (UIScrollView *)self.view;
      CGRect rc;

      // Degrees
      rc = [customCell.degrees convertRect:[customCell.degrees bounds] toView:scrollView];

      if (tapLoc.x >= rc.origin.x && tapLoc.y >= rc.origin.y && tapLoc.x <= (rc.origin.x + rc.size.width) && tapLoc.y <= (rc.origin.y + rc.size.height)) {
        NSLog(@"touch within bounds for DEGREES");
        touchField = customCell.degrees;
      }

// Repeat for other textfields here ....

....

私のコードでは、didSelectRowAtIndexPath コード内と同様に、touchField 内にフィールドを保存します。すでに prevField/currField 値を処理して、currField の有効化/無効化を制御しuserInteractionEnabled、currField を次のように設定しています。becomeFirstReponder

これが誰かに役立つことを願っています:)

于 2012-09-16T12:42:10.987 に答える
0

NSNotificationCenterを使用してUITextFieldTextDidBeginEditingNotificationの通知を要求することを考えましたか?

viewDidLoadで

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(textFieldBeganEditing) 
                                             name:UITextFieldTextDidBeginEditingNotification object:nil];

そして

-(void) textFieldBegainEditing: (NSNotification*) notification {
  // [notification object] will be the UITextField
  // do what you need to do with it (resign, become first responder)
}
于 2012-09-16T03:22:11.143 に答える
0

以前、テキスト ボックスがタッチされたかどうかを確認する必要があったとき、YourTextField.text.length > 0 かどうかを確認しました。そうであれば、becomeFirstResponder を設定できます。お役に立てれば。

于 2012-09-14T17:00:08.530 に答える