Метод UITableView didSelectRowAtIndexPath не получает вызов

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

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

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

//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

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

И затем сделайте следующее:

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

Ответ 2

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

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

Ответ 3

Из того, что я вижу, вы не устанавливаете self.list в массив, который вы получаете в

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

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

Ответ 4

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

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

#define MAIN_TABLE_VIEW 1001

#define DROP_DOWN_TABLE_VIEW 1002

Теперь в didSelectRowAtIndexPath попробуйте перенаправить свой путь выполнения в правую таблицуView на основе значений тегов.

- (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 и 1 datasource UITableView.

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

Ответ 5

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

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

Переназначить делегатов при показе или вызове/загрузке tableview из другого представления.

Надеюсь, это полезно..:)

Ответ 6

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

enter image description here

Ответ 7

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