2015-04-02 95 views
0

我編程我的iOS應用程序的形式,我UITextField民事法律行爲奇怪:的UITextField的.text屬性總是返回一個空字符串

當窗體處於更新狀態(字段已經),我可以編輯和使用.text屬性獲取新的輸入文本(由用戶鍵入)。但是當表單處於插入模式時,UITextField s最初是空的,我無法獲得用戶使用.text屬性鍵入的文本,因爲無論用戶輸入什麼內容,它總是返回一個空字符串。 下面是該問題的視頻:https://youtu.be/tPJZ3sC-IFU

{ 
    __weak IBOutlet UITextField *txtLibelle; //linked by ctrl + drag to the storyboard 
    NSString *libelleTemp; 
} 
- (void)viewDidLoad { 
[super viewDidLoad]; 

    // ... 

    [txtLibelle addTarget:self 
        action:@selector(editingChanged:) 
     forControlEvents:UIControlEventEditingChanged]; 

    // ... 

} 

-(void) editingChanged:(id)sender { 
    libelleTemp = txtLibelle.text; 
    // libelleTemp is set to @"" whatever the user has typed in when I'm in insert mode 
} 

-(void)initWithLib:(NSString *)lib { 
    libelleTemp = [NSString stringWithString:lib]; 
} 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [super tableView:tableView cellForRowAtIndexPath:indexPath]; 
    if (indexPath.section == 0) { 
     txtLibelle.text = libelleTemp; 
    } 

    // ... 

    return cell; 
} 

的initWithLib:方法是從以前的視圖控制器這樣調用:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    UIStoryboard *accueilNavSB = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    FicheAlerteTableViewController *vc = [accueilNavSB instantiateViewControllerWithIdentifier:@"ficheAlerte"]; 
    NSString *libelle = @""; 
    [vc initWithLib:libelle]; 
    [self.navigationController showViewController:vc sender:self]; 
} 

我已經重新鏈接從故事板的領域上我的課,並且在調試模式下,我的UITextField不是零。

我的文本框位於靜態的UITableView中,所以我可以看到更新是否將單元格從屏幕上滾動,然後滾動。

有誰知道爲什麼會發生這種情況,以及如何解決這個問題?

+1

你是什麼意思,你不能通過.text獲取輸入文本? – 2015-04-02 15:04:55

+0

如果插入模式下的文本字段爲空,那麼如何通過.text屬性獲取字符串?無論如何,這是一個空的字符串。 – 2015-04-02 15:07:10

+0

已編輯的問題。 – 2015-04-02 15:16:13

回答

1

你的代碼有一個錯誤。您沒有使用正確的屬性將文本加載到標籤中。請使用此選項。

這對我有效。我在我的Xcode上測試了這個。

-(void) editingChanged:(id)sender { 
    //label1.text = field.text; 
    libelleTemp=field.text; 
    NSLog(@"text is %@",libelleTemp); 
    // libelleTemp is set to @"" whatever the user has typed in when I'm in insert mode 
} 
+0

這不起作用,我認爲問題在別的地方。它的行爲就像用戶沒有輸入任何內容。 field.text仍然返回一個空字符串。 – 2015-04-02 15:38:08

+0

我測試了我的Xcode,它工作正常。你能告訴我你如何聲明字符串以及你如何訪問它嗎?> – 2015-04-02 15:42:49

+0

我把這個問題(我已經添加了一個顯示問題的視頻)。 – 2015-04-02 15:50:58

0

您正在使用的UITextField,它可以使用UITextFieldDelegate登記編輯的事件和這樣。有關更多信息,請參閱Apple的documentation

我相信你正在尋找的方法是:

<UITextFieldDelegate> //link your textField.delegate = self 

- (void)textFieldDidEndEditing:(UITextField *)textField { 
    libelleTemp = textField.text; 
} 

你可以嘗試的另一件事是直接掛鉤的(IBAction爲)方法,而不是編程設定的目標。只需控制拖動以將此方法鏈接到IB中的文本字段即可。

- (IBAction)libelleEndedEditing:(UITextField *)sender { 
    libelleTemp = sender.text; 
} 
+0

我已經試過這個,但沒有解決我的問題。 .text屬性仍爲空。我認爲這個問題與處理事件無關。 – 2015-04-02 16:18:58

+0

嗯,我不確定,但看看你實例化這個視圖控制器的方式。最佳做法是執行segue並從那裏訪問它。並在viewdidload中調用initwithlib – 2015-04-02 16:21:06

0

您正在使用錯誤的操作。 UITextField的「文本」屬性只有在編輯結束後纔會設置。所以你需要將你的方法連接到Interface Builder中的「Editing Ended」事件。

相關問題