2015-09-17 2 views
0

У меня есть ячейка tableView с UITextField для ввода текста. Я наполнение Tableview со следующим кодом:Метод делегата для UITextField не называется

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *cellIdentifier = @"Ingredient Cell"; 
    IngredientsTableViewCell *ingredientCell = [self.ingredientsTableView dequeueReusableCellWithIdentifier:cellIdentifier]; 

    // NSManagedObjectContext *managedObject = [self.ingredientItems objectAtIndex:indexPath.row]; 
    if (ingredientCell == nil) 
    { 
     ingredientCell = [[IngredientsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
     ingredientCell.accessoryType = UITableViewCellAccessoryNone; 
     [ingredientCell addSubview:ingredientCell.ingredientTextField]; 
     [ingredientCell.ingredientTextField addTarget:self action:@selector(editingChanged:) forControlEvents:UIControlEventEditingChanged]; 

    } 

    //Populate the textfield in the ingredientCell 
    ingredientCell.ingredientTextField.text = [self.ingredientItems objectAtIndex:indexPath.row]; 

    return ingredientCell; 
} 

Ниже приводится @selector(editingChanged:) метода TextField, который никогда не выполняет. Что я делаю не так?

-(void) editingChanged:(id)sender{ 
    NSLog(@"hi"); 

    // get the text being entered 
    NSString *ingredientText = ((UITextField *)sender).text; 

    //get the index of the selected row 
    NSInteger selectedIndex = [self.ingredientsTableView indexPathForSelectedRow].row; 

    //save the text to the array 
    [self.ingredientItems setObject:ingredientText atIndexedSubscript:selectedIndex]; 
} 
+1

BTW - 'editChanged:' не является методом 'UITextFieldDelegate'. – rmaddy

+0

Похоже, слишком много копирует и копирует код. В этом методе создания ячейки есть что-то странное. Вы создаете «IngredientCell» и, возможно, повторно добавляете в него одно из своих подпрограмм? Вы также добавляете subview в ячейку вместо своего contentView. С этим кодом слишком много ошибок, чтобы определить, что происходит. Возможно, после внедрения IngredientCell (создается ли это с помощью прототипа ячейки в раскадровке?). Я предполагаю, что у вас есть 2 текстовых поля в этой ячейке, одна из них скрывает другую. – Rog

ответ

0

Таким образом, вы будете хотеть использовать textFieldDelegate (или если вы авантюризма, вы можете использовать ReactiveCocoa).

Добавьте это в верхней

<UITextFieldDelegate> 

И это в cellForRowAtIndexPath

ingredientCell.ingredientTextField.delegate = self; 
ingredientCell.ingredientTextField.tag = 1; 

И этот метод делегата

//Use this method instead of addTarget: 
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField { 
    if (textField.tag == 1){ 
     //do some stuff 
    } 
} 

посмотреть переполнения стека пост: iOS - Adding Target/Action for UITextField Inside Custom UITableViewCell

Но у вас может быть и немного другая проблема. Эта строка кода кажется излишним:

[ingredientCell addSubview:ingredientCell.ingredientTextField]; 

Вы ингредиентом клетка кажется, что он уже должен иметь ingredientTextField как подвид. Это может вызвать проблемы. Вы можете добавить его как подвид в XIb, который прилагается к классу ingredientsTableViewCell, или просто добавить его в коде, как

[self addSubview:ingredientTextField] 

Надежда, что помогает.

-2

Вы можете добавить эту строку в cellForRowAtIndexPath и добавить UITextFieldDelegate в Viewcontroller.h файл

ingredientCell.ingredientTextField.delegate = self; 
[ingredientCell.ingredientTextField addTarget:self action:@selector(editingChanged:) forControlEvents:UIControlEventEditingChanged]; 

Это событие TextField контроллер

UIControlEventEditingDidBegin  = 1 << 16,  // UITextField 
UIControlEventEditingChanged  = 1 << 17, 
UIControlEventEditingDidEnd  = 1 << 18, 
UIControlEventEditingDidEndOnExit = 1 << 19,  // 'return key' ending editing 
+0

Как это помогает? Вопрос в том, что метод 'editChanged: 'не вызывается. Это не метод делегата, поэтому настройка свойства 'delegate' текстового поля не будет его исправлять. – rmaddy

+0

Используйте этот новый код, который отлично работает в моем проекте. –

+0

Это тот же код, что и в вопросе. – rmaddy

-1
if (ingredientCell == nil) 
{ 
    ingredientCell = [[IngredientsTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; 
    ingredientCell.accessoryType = UITableViewCellAccessoryNone; 
    [ingredientCell addSubview:ingredientCell.ingredientTextField]; 
    [ingredientCell.ingredientTextField addTarget:self action:@selector(editingChanged:) forControlEvents:UIControlEventEditingChanged]; 

} 

эта часть выглядит много проблемы попробуйте вынуть эту линию с, если заявление

[ingredientCell.ingredientTextField addTarget:self action:@selector(editingChanged:) forControlEvents:UIControlEventEditingChanged]; 

Это поможет вам.

+0

How удаляет ли эта проблема, чтобы устранить проблему? – rmaddy

+0

as editingChanged: метод добавляется только как target, а ячейка - в ноль. Добавление его в каждую ячейку устранит проблему –

+0

Вы хотите, чтобы цель была добавлена ​​один раз на ячейку. Перемещение его вне оператора 'if' добавит цель каждый раз, когда ячейка будет повторно использована. Это не то, что вы хотите. – rmaddy

Смежные вопросы