簡體   English   中英

從TableViewCell上的UITextField獲取文本

[英]Get text from UITextField on a TableViewCell

我有一個UITableViewController,原型單元包含UITextFields。 為了配置這些定制單元,我創建了一個UITableViewCell子類。 我已經通過一個出口(nonatomic, weak)將textField選擇到單元的子類中。

在這個子類上,我創建了一個協議,UITableViewController是該協議的委托,因此每當這些textField中的內容發生變化時,TableViewController都會知道它。 基本上我希望這可以將值保存在NSUserDefaults上

此外,為了從這些textField中動態獲取值,我可以執行以下操作:

((TextFieldCell*)[self.tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:0]]).textField.text

大多數時候都可以。 但是,當textField由於已滾動而在視圖之外時,從textField.text獲得的值是(null)。 一旦再次進入視圖,一切都會恢復正常。

我試圖將出口從弱變強,但無濟於事。

我想我可以在類上定義一些私有的NSString,並在調用委托協議時將其填寫。 問題是我想讓我的代碼盡可能通用,同時使對私有變量的需求盡可能少,主要是為了簡化單元格生成代碼。

當文本字段不在視圖中時,還有其他方法可以獲取它們嗎?

提前致謝!

但是您知道UITableView僅保留可見矩形的單元格嗎? 當一個單元格離開屏幕,並且另一個單元格需要一個新的單元格才能進入可見區域時,舊的單元格將重新用於新內容。

因此,表視圖的每一行都沒有一個單元格。 而且,如果您的表包含大量數據,則行數要比單元格多得多。

正如Thyraz所說,UITableView僅保留可見rect的單元格-並具有合理的緩沖區以允許滾動。 這就是為什么“重用標識符”如此重要的原因,它們指示哪些單元可用於哪些表(當您要擔心多個表時,這很關鍵)。 不幸的是,這本身並不能回答您的問題。

存儲這些textViews內容的責任不在UITableView的肩上。 通過數據源委托協議提供數據是您的工作,因此,您應該在數據源中查詢該信息。

編輯:這意味着,您應該將此數據存儲在其他位置,通常以包含表視圖的視圖控制器類上的屬性形式存儲。 我建議你使用的NSArray為目的,但你也可以做到這一點通過類型的字典,甚至在不得已的(這在理論上是多了,你可以做到這一點,但它是一個非常糟糕的想法之類的話) ,一系列屬性。 就我個人而言,我幾乎總是使用NSArrays,因為它們的結構適合於該問題,但是從理論上講,您可以采用其他方式。 (我只使用了一次基於dict的結構,那是我的數據嵌套在遞歸結構中的情況)

UITableViewController不會使單元格離開屏幕。 您可以使用以下模式來獲得先前使用的模式,以進行內存管理優化,但是您必須假設每次進入屏幕(即使出隊)時都需要重置單元格的值,因為無法保證值將是。

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier1 = @"Cell1";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier2];
    if( cell == nil ) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier1] autorelease];
        cell2.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
        cell2.editingAccessoryType = UITableViewCellAccessoryNone;
    }   
    switch( indexPath.section ) {
        case first_Section:
            if( row == 0 ) {
                cell1.textLabel.text = @"Some Text";
                cell1.accessoryView = [self myCustomViewControl];
                cell = cell1;
            }
            ... etc
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM