2015-05-20 2 views
15

У меня есть UIViewController с UITableView в нем. В tableview есть настроенные ячейки с текстовыми полями внутри него. Делегаты текстового поля настроены на этот класс.UITableView's didSelectRowAtIndexPath метод не получает вызов

При редактировании текстового поля (textFieldDidBeginEditing) У меня есть раскрывающийся список (UIView с табличным просмотром). Выпадающий список создается программно. Проблема, с которой я столкнулся, - это не didSelectRowAtIndexPath выпадающего меню. Я правильно поставил делегат, источник данных для класса. Я также удалил все остальные жесты. Я убедился, что tableview не находится в режиме редактирования.

По щелчкам ячеек в раскрывающемся списке единственное, что работает, это методы делегата моего текстового поля моего фона.

//UITableView class(with textfield from where dropdown is loaded.) 
- (void)textFieldDidBeginEditing:(UITextField *)textField{ 

if(textField.tag == 3){ 
    if(dropDown == nil) { 
     CGFloat f = 200; 
     dropDown = [[SFTextFieldDropDown alloc] showDropDownWithSender:textField withHeight:f andElements:self.list]; 
     dropDown.delegate = self; 
     } 
    } 
} 

// Custom Drop down class. 
- (id)showDropDownWithSender:(UITextField *)senderTextField withHeight:(CGFloat)height andElements:(NSArray *)array{ 

    table = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, btn.size.width, 0)]; 
    table.delegate = self; 
    table.dataSource = self; 
    table.layer.cornerRadius = 5; 
    table.backgroundColor = [UIColor colorWithRed:0.239 green:0.239 blue:0.239 alpha:1]; 
    table.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
    table.separatorColor = [UIColor grayColor]; 
    [table setAllowsSelection:YES]; 
    table.frame = CGRectMake(0, 0, btn.size.width, *height); 
    [table setEditing:NO]; 
    [self addSubview:table]; 
} 
return self; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return 1; 
} 

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
return 40; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
return [self.list count]; 
} 


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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    cell.textLabel.font = [UIFont systemFontOfSize:15]; 
    cell.textLabel.textAlignment = NSTextAlignmentLeft; 
    cell.selectionStyle = UITableViewCellSelectionStyleDefault; 
} 
if([list count] > 0) 
    cell.textLabel.text = [list objectAtIndex:indexPath.row]; 

return cell; 
} 
+1

Показать свой код .. –

+1

Пожалуйста, добавьте ваш код для лучшего обзора –

+1

Добавили ли вы какой-либо жест вашему мнению ?? –

ответ

3

Я думаю, что ваши прикосновения принимаются UITextField и не передаются следующей ячейке. Вам нужно сначала установить textField.userInteractionEnabled = NO так, чтобы прикосновения были получены ячейкой.

А потом это сделать:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    // get the reference to the text field 
    textField.userInteractionEnabled = YES; 
    [textField becomeFirstResponder]; 
} 
+0

По-прежнему делегат текстового поля захватывает щелчок. –

3

Из того, что я вижу, что ты не заселять свой TableView, это так просто.

Если вы не даете ему массив и не вызываете - reloadData, то он никогда не вызовет методы делегата. (numberOfRowsInSection и cellForRowAtIndexPath)

+0

Я заполняю таблицу. cellForRowAtIndexPath и другие методы источника данных отлично работают в классе Dropdown. Его события щелчка, которые не работают. –

2

Из того, что я могу видеть, что вы не устанавливая self.list в массив вы получаете в

- (id)showDropDownWithSender:(UITextField *)senderTextField 
        withHeight:(CGFloat *)height 
       andElements:(NSArray *)array 

Добавить self.list = array и что должен это исправить

+0

Я делаю это. Просто я не публиковал эту часть кода. Список таблиц по праву заполнен списком. –

2

Так с вашим вопросом объяснения, у вас есть полностью два UITableView в представлении ViewController & несколько UITextFields (например, textField, который вызывает dropdown &, в раскрывающемся списке есть текстовые поля в каждой строке.)

Итак, проблема заключается в том, что UITableView delegate установлен в self (это означает, что два UITableView делегируют один класс. Поэтому после получения didSelectRowAtIndexPath делегат, который должен быть рассмотрен, чтобы ответить на него. Для этого нужно добавить теги к TableView, как

#define MAIN_TABLE_VIEW 1001

#define DROP_DOWN_TABLE_VIEW 1002

Сейчас в вашем didSelectRowAtIndexPath, попытайтесь повторно направить ваш путь выполнения в правой Tableview на основе значений тегов.

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    if(tablview.tag == MAIN_TABLE_VIEW){ 
    // follow your code for main table view here 
    } 

    if(tablview.tag == DROP_DOWN_TABLE_VIEW){ 
    // follow your code for dropdown table view here. 
    } 
} 

Такой же подход вы, возможно, придется следовать всем delegates из UITableView.

Надеюсь, что это решит цель.

+0

Та же метка должна быть сделана и для 'UItextField'. –

+0

Нет. Десятилетие отображения раскрывающегося списка, я обрабатываю другой класс. –

+0

Затем используйте 'sender.bounds' вместо' 0', установив рамку 'Dropdown UITableView'. Подобно 'sender.bounds.origin.x, sender.bounds.origin, y, width, height' –

2

Я думаю, у меня была та же проблема, где вы объявили UITableViewDelegate и UITableViewDataSource, только в ViewController?

Я думаю, что вы потеряли делегата, потому что вам нужен и назначил делегата на TableView внутри UIView? Правильно?

Переназначьте делегатов при предъявлении или по телефону/загрузки TableView с другой точки зрения ..

Надежда это полезно .. :)

2

Я был в состоянии сделать что-то очень похожее на то, что вы пытаетесь сделать для прошлого проекта. То, что мы в конечном итоге делаем было использование textfield.inputView вместо того, чтобы содержать tableView так:

enter image description here

1

Неясно, какой вид вы хотите добавить свой выпадающий подвид в Вы добавляете его в Tableview или в представлении. который содержит tableView (кстати, по вашему описанию вы НЕ используете UITableViewController). Я предполагаю, что вы добавляете его в tableview, и это вызывает проблемы. Попробуйте добавить его в общий ViewController.view (это означает, что вам нужно будет получить правильные координаты кадра относительно текстового поля внутри ячейки).

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