3

を含むUITableViewカスタムを使用しています。UITableViewCellUITextField

myMethodメソッド ( ) がクリックされたときに呼び出したい( ) と、次のようにしてデリゲート メソッドUIControlEventTouchDown内でこれを接続しようとしました。UITableViewcellForRowAtIndexPath

[tf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown];

をクリックしてUITextFieldも何も起こりません。

UITextFieldの外側の別のものに対してまったく同じことをしようとしましたUITableView:

[othertf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown];

クリックするとothertf、期待どおりにメソッドが呼び出されます。

tf交換したことを除けば、コードは同じであるため、少し混乱していますothertf

以下は の完全なコードですcellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *DetailCellIdentifier = @"DetailFieldView";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:DetailCellIdentifier];
    if (cell == nil) {
        NSArray *cellObjects = [[NSBundle mainBundle] loadNibNamed:DetailCellIdentifier owner:self options:nil];
        cell = (UITableViewCell*) [cellObjects objectAtIndex:0];
    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    UITextField *tf = (UITextField *)[cell viewWithTag:2];
    tf.text = @"some value";

    [othertf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown];
    [tf addTarget:self action:@selector(myMethod) forControlEvents:UIControlEventTouchDown];

    return cell;
}

誰かが私が間違っていることを見つけることができますか? 私はiOS開発に慣れていないので、おそらく単純なものです。

4

2 に答える 2

8

使用UITextField delegate方法:

UITextField デリゲート

//Use this method insted of addTarget:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {

    if (textField == tf) {
        [self myMethod];
        return NO;
    }

  return YES;
}

デリゲートを textField に設定することを忘れないでください。

 tf.delegate = self;
于 2012-11-14T09:27:58.490 に答える
1

UITextField に触れると、タッチ自体を飲み込み、キーボードに表示などを指示します。代わりに、次のイベントを使用します。

UIControlEventEditingDidBegin

UIControlEventEditingDidEnd

UIControlEventEditingChanged

さらなる改善

タグは、NIB とコードを結合するかなり緩い方法です。DetailCell.handファイルを作成DetailCell.mし、NIB ファイルのルート ビューを DetailCell クラスに設定し、コードでアクセスする必要があるすべてのビューの参照アウトレットと、反応する必要があるすべてのアクションのアクション アウトレットを作成することを検討してください。

ここに画像の説明を入力

これは、Ctrl キーを押しながらインターフェイス ビルダーのビューをクリックし、DetailCell.hファイルにドラッグすることによって実行されます。Interface Builder は、アクションまたは参照アウトレットのどちらを作成するかを尋ねます (参照は基本的にポインターであり、アクションは基本的にイベントです)。

dequeueReusableCellWithReuseIdentifierinitWithFrameは、新しいインスタンスを作成するたびに DetailCell クラスを呼び出します。この関数で NIB ファイルをロードするのはあなたの仕事です。

または、テーブルビューでセルを再利用するためにNIBファイルを登録することもできます

[tableview registerNib:[UINib nibWithNibName:DetailCellIdentifier bundle:nil] forCellWithReuseIdentifier: DetailCellIdentifier];

これにより、新しいセルが作成されるたびに nib ファイルが自動的に読み込まれます。>= iOS 5 (AFAIK)では がdequeueReusableCellWithReuseIdentifier返されることはありませんがnil、登録されたクラス/nib ファイル自体のインスタンスが毎回作成されます。

于 2012-11-14T10:08:46.203 に答える