11

だから私はかなり見回しましたが、ここにはこれを行う正しい方法を正確に説明しているようには見えません. カスタム UITableViewCell 内に 7 つの UITextFields があります。

私の質問はこれです: これらの UITextFields のデリゲートを管理する正しい方法は何ですか?

カスタムセルは技術的にはプロジェクトの「モデル」部分の一部であるため、UITableView を制御するコントローラーでテーブルのセルのテキストフィールドも制御したいのですが、デリゲートを設定する方法がわかりませんテキスト フィールド (UITableViewCell のサブクラスで作成される) をこのビュー コントローラーに追加します。

UITableViewCell のサブクラスを UITextField デリゲートに準拠させ、そのすべてを管理するのは悪い習慣でしょうか? もしそうなら、他にどうすればいいですか?

ありがとう、助けていただければ幸いです。

4

5 に答える 5

16

セルのテキスト フィールドのデリゲートをビュー コントローラーに設定しても問題はありません。

これはあなたがする必要があることです:

1)View ControllerはUITextFieldDelegateプロトコル を実装する必要があります

2) カスタム セルのテキスト フィールドのプロパティを宣言します。

@property (nonatomic, retain) IBOutlet UITextField *textField;

3) 次に、View Controller をメソッドでテキスト フィールドのデリゲートとして設定します。 cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";

    MyCustomCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (cell == nil) 
    {  
        // use this if you created your cell with IB
        cell = [[[NSBundle mainBundle] loadNibNamed:@"MyCustomCell" owner:self options:nil] objectAtIndex:0];   

        // otherwise use this  
        cell = [[[MyCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 


        // now set the view controller as the text field delegate  
        cell.textField.delegate = self;
    }

    // configure cell...

    return cell;
}
于 2012-07-17T08:52:46.890 に答える
7

私の意見では、セルは UITextField を保持しているため、キーボードを管理する必要があります。セルを UITextField デリゲートとして設定できます。私自身のアプリケーションでは、これを行ってから、セルに独自のデリゲートを作成しました。UITextField のメソッドまたはコントローラーで処理する必要がある新しいメソッドは、cells デリゲートを介してコントローラーに渡すことができます。

このようにして、セルは、アプリケーションが実際に何をしているかを知らなくても汎用的なままにすることができます。

于 2012-07-17T01:08:28.373 に答える
0

Swift バージョン (Eyal の回答に基づく)

class MyViewController: UIViewController, ... , UITextFieldDelegate {

    @IBOutlet var activeTextField: UITextField!  //doesn't need to connect to the outlet of textfield in storyboard

    ....

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    ....

    var cellTextField = self.view.viewWithTag(101) as? UITextField
    cellTextField!.delegate = self;
    ....
}
于 2015-09-01T14:19:23.317 に答える
0

私の提案は、テーブル内のセクション、行、および7つのテキストビューの1つをエンコードする値で各textFieldの「タグ付け」(つまり、タグを設定) し、UIViewController をデリゲートにすることです。

したがって、これらのサイズを制限する必要があります。たとえば、100 行を超えることはないとします。したがって、これを次のようにエンコードします。

.tag = 1000*セクション + 100*行 +

メッセージを受け取ったら、メソッド/関数でタグを取得し、それをセクション、行、タグにデコードして、必要な処理を実行できます。

于 2012-07-16T23:49:54.730 に答える
0

TableViewController をデリゲートとして宣言するには、TableViewController の .h ファイルの<UITextFieldDelegate>最後にインクルードします。@interface

@interface MyTableViewController : UITableViewController <UITextFieldDelegate>

次に、 の下の各フィールドを Ctrl キーを押しながらドラッグして、テキスト フィールドを接続します@interface。各 UITextField は、IBOutlet によってそれぞれのプロパティに接続されます。最後に、.m ファイルに次の関数を含めて、どのフィールドを返したいかをデリゲートに示します。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [aTextField resignFirstResponder];
    return YES;
}
于 2012-07-16T23:52:59.057 に答える