2012-07-16 44 views
9

所以我已經環視了一下,這裏沒有任何東西似乎解釋了完成此操作的正確方法。我有一個自定義的UITableViewCell中的7個UITextFields。在自定義UITableViewCell中管理UITextFields的代理

我的問題是這樣的:什麼是正確的方式來管理這些UITextFields的委託?

由於自定義單元在技術上是項目「模型」部分的一部分,我寧願讓控制器控制UITableView也控制表格單元格中的文本字段,但我無法弄清楚如何設置該視圖控制器的文本字段的代表(在UITableViewCell的子類中創建)。

只是讓UITableViewCell的子類符合UITextField委託並管理那裏的所有東西是不好的做法?如果是這樣,我該怎麼做呢?

謝謝,任何幫助,將不勝感激。

回答

0

我的建議是將每個textField的「標記」(即設置標記)與一個值編碼表中的部分,行和七個文本視圖中的一個值,然後使UIViewController成爲委託。

所以你需要限制這些的大小 - 比如你永遠不會超過100行。所以你這個編碼爲:

.TAG = 1000 *節+ 100 *行+

當你得到一個消息,你可以有一個方法/函數使用標記並解碼成段,行,標籤,並做你需要做的事情。

0

要聲明您的TableViewController作爲代表包括<UITextFieldDelegate>在您的@interface在TableViewController的.h文件的末尾。

@interface MyTableViewController : UITableViewController <UITextFieldDelegate> 

然後,通過按住Ctrl拖動@interface下的每個字段來連接文本字段。每個UITextField都通過IBOutlet連接到其各自的屬性。最後,在.m文件包括下列函數來顯示你想返回現場委託....

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
    [aTextField resignFirstResponder]; 
    return YES; 
} 
6

在我看來,單元應該管理的鍵盤,因爲它是保持在一個的UITextField。您可以將您的單元格設置爲UITextField委託。在我自己的應用程序中,我已經完成了這一步,然後讓我的單元擁有它自己的代理。 UITextField的任何方法或應該由控制器處理的任何新方法都可以通過單元委託傳遞給控制器​​。

通過這種方式,在不知道應用程序實際正在做什麼的情況下,單元仍然可以是通用的。

+1

我同意。要做到這一點,只需在UITableViewCell實現的初始化中設置委託。例如,在awakeFromNib調用中,只需添加self.YourTextField.delegate = self。 – JeffB6688 2017-04-14 19:00:20

+0

同意這是做到這一點的正確方法。 – GeneCode 2017-04-20 07:46:39

16

你不應該有一個問題,設置該單元格的文本字段的代表作爲您的視圖控制器。

這就是你需要做什麼:

1)視圖控制器需要實現UITextFieldDelegate協議

2)申報文本字段屬性在您的自定義單元格

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

3)然後將視圖控制器設置爲方法中的文本字段的代理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; 
} 
+0

謝謝!爲我工作 – 2016-12-13 17:40:59

0

Swift version(基於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; 
    .... 
}