Каковы возможные причины, по которым - (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *) indexPath не вызывался?

У меня действительно странная проблема.

В моем табличном представлении установлен весь делегат и источник данных.

Все в порядке.

Однако нажатие строк не активируется:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Я использовал пользовательские ячейки.

После того, как я нажимаю и кликаю, щелкните и щелкаю и щелкаю, иногда он проходит.

Интересно, что это может сделать? Это как будто customCell "поглощает" событие касания или что-то или что?

Вот почему? Если это так, если мы хотим реализовать customCell, и мы хотим, чтобы tableView обрабатывал событие touch up, что нам делать?

Дополнительный симптом:

Если я удаляю взаимодействие пользователя с пользовательской ячейкой, тогда проблема решается с помощью catch.

enter image description here

Однако нажатие кнопки каким-то образом удалит все тексты ярлыков в customCell.

enter image description here

Реализация пользовательской ячейки следующая:

- (BGUIBusinessCellForDisplay *) initWithBiz: (Business *) biz
{
    if (self.biz == nil) //First time set up
    {
        self = [super init]; //If use dequeueReusableCellWithIdentifier then I shouldn't change the address self points to right
        NSString * className = NSStringFromClass([self class]);
        //PO (className);
        [[NSBundle mainBundle] loadNibNamed:className owner:self options:nil];
        self.frame =self.view.frame;
        [self addSubview:self.view]; //What is this for? self.view is of type BGCRBusinessForDisplay2. That view should be self, not one of it subview Things don't work without it though
    }
    if (biz==nil)
    {
        return self;
    }

    _biz = biz;

    self.prominentLabel.text = [NSString stringWithFormat:@"Isi: %@", biz.isiString];
    self.Title.text = biz.Title; //Let set this one thing first
    self.Address.text=biz.ShortenedAddress;

    //if([self.distance isNotEmpty]){
    self.DistanceLabel.text=[NSString stringWithFormat:@"%dm",[biz.Distance intValue]];
    self.PinNumber.text =biz.StringPinLineAndNumber;
    NSString * URLString=nil;
    if(biz.Images.allObjects.count!=0){
        //self.boolImage=[NSNumber numberWithBool:true];
        Image * image=(biz.Images.allObjects)[0];
        URLString = image.URL;
        URLString = [NSString stringWithFormat:@"http://54.251.34.144/thumbnailer/Thumbnailer.ashx?imageURL=%@",URLString.UTF8Encode];
        //url=[NSURL URLWithString:image.URL];
    }else{
        float latitude = biz.getCllLocation.coordinate.latitude;
        float longitude = biz.getCllLocation.coordinate.longitude;
        URLString = [NSString stringWithFormat:@"http://maps.googleapis.com/maps/api/staticmap?&zoom=16&size=160x160&maptype=roadmap&sensor=true&center=%f,%f&markers=size:small|color:blue|%f,%f",latitude,longitude,latitude,longitude];
        URLString = URLString.UTF8Encode;

    }


    //Should add code and add loading indicator here
    [BGHPTools doBackground:^{
        UIImage * imageBiz = [BGMDImageCacherAndDownloader getImageFromURL:URLString];

        [BGHPTools doForeGround:^{
            self.Image.image=imageBiz;
            [self.Image makeRound];
        }];
    }];

    //self.view=self.view;

    /*if (self.tableViewCell == Nil)//Instantiate that tableviewCell
    {
        PO(self.tableViewCell);
    }
    self.tableViewCell.business = bis;
    self.pinLbl.text = bis.StringPinLineAndNumber;
    self.lblTitle.text=bis.Title;
    //self.pinLbl.text=bis.pinNumber;*/
    //}
    /*self.name=[dict objectForKey:@"Title"];
     self.address=[dict objectForKey:@"Street"];
     CLLocation * cll=[[CLLocation alloc]initWithLatitude:[[dict objectForKey:@"Latitude"] doubleValue] longitude:[[dict objectForKey:@"Longitude"] doubleValue]];
     self.distance=[NSNumber numberWithDouble:[cll distanceFromLocation:[cachedProperties currentLocation]]];*/

    return self;

Обновление: я уже понял, почему тексты исчезли. Оказывается, мой фон белый. Когда строка была выбрана, текст внезапно превращается в белый. Поэтому, установив выбранный стиль на синий, я вроде как получаю "фиксированный".

Однако я все еще не вижу, где в моем коде я указываю, что все тексты ярлыков должны быть белыми, если выбран основной TableViewCell.

В конце концов, выбранная ячейка, а не метка. Как, черт возьми, ярлык знает, что он должен превратиться в белого цвета, вне меня.

Ответы

Ответ 1

Я просто хочу обновить, что, по-моему, я выяснил, в чем проблема, но все еще не может решить это совершенно правильно. И хорошо обновление является всеобъемлющим, поэтому я думаю, что это должен быть ответ, хотя я надеюсь, что это не ответ, потому что головоломка все еще отсутствует.

Вся проблема взаимосвязана.

Проблема в этой строке:

[self addSubview:self.view]; 

Я в основном превращаю это в:

В основном моя пользовательская ячейка просмотра имеет вид, тип которого также является tableViewCell. Этот вид охватывает реальный tableViewCell.

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

Вот почему ярлык "исчезает". Что происходит, этикетка не исчезает. Метка была выделена и стала белой. Однако то, что выделяется, - это TableViewCell, а не вид opague. Белый opa self.view по-прежнему белый, а сам tableCell окрашен в синий цвет. Таким образом, ярлык становится белым на середине белого фона и исчезает.

Я думаю, что я должен заменить [self addSubview: self.view] на self = self.view

Однако это означало бы изменение значения "я". Да, это в init. Но это все еще неудобно. Если у кого есть ПУТЬ для реализации пользовательского подкласса пользовательского интерфейса с XIB, это будет здорово, потому что я до сих пор не нашел его.

Awkward.

Интересно, можем ли мы нарисовать указатель на XIB и указать, что выход является самим собой.

Если это не удастся, я установлю фон self на белый и фон self.view на прозрачный.

После тонны ошибок и попыток я сделал это:

self.contentView.backgroundColor = [UIColor whiteColor];   //self.view.backgroundColor = [UIColor redColor];   self.frame = self.view.frame;

/*PO(self.view.subviews);
PO(self.subviews);
PO(self.Title.superview);
PO(self.Title);
PO(self.view);
PO(self.Title.superview);
PO(self.view.contentView);*/
//Suck all the subviews from my minions
for (UIView* aSubView in self.view.contentView.subviews) {
    [self.contentView addSubview: aSubView];
    //[self.contentView add]
}

В основном я "перемещаю" все подвидные объекты моего представления на свой объект. Есть уловка, хотя при подклассификации tableViewCell я должен переместить subviews contentView. Кто знает, почему.

В конце я просто установил self.view на нуль, потому что он больше не нужен, и моя программа работает так, как ожидалось.

Также, чтобы установить фон вашего TableViewCell, вам также нужно установить фон self.contentView, а не self.view.

Другой подход, который вы можете попробовать, - использовать панель рассказов. Кроме того, вы можете просто переместить contentView в self.view для себя.

Ответ 2

Скорее всего, просмотр в вашей пользовательской ячейке поглощает прикосновение. Иногда это то, что вы хотите, например. кнопка, которая что-то делает, а не выбор всей ячейки. Предполагая, что вы этого не хотите, просто установите для свойства viewsSignInteractionEnabled значение NO.

- Дополнительный код для пользовательской загрузки NIB.

Все, что вам нужно сделать, это зарегистрировать NIB в вашей программе viewDidLoad:

[tableView registerNib: [UINib nibWithNibName:@"yourCellNibName" bundle:nil] forCellReuseIdentifier:@"yourCellTypeID"]  

а затем в вашем cellForRowAtIndexPath просто вызовите:

newCell = [tableView dequeueReusableCellWithIdentifier @"yourCellTypeID"];
...
return newCell;

И он загрузит ячейку из вашего XIB (или предоставит вам одну из ранее использованной очереди).

Ответ 3

Если вы используете Storyboard для обработки интерфейса, вместо использования:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

Попробуйте использовать

#pragma mark --- Push selectedObject to the detailView ---

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    RRAppDelegate *myAppDelegate = [[UIApplication sharedApplication]delegate];
    if ([[segue identifier] isEqualToString:@"PushObjectSegue"]) {
        NSIndexPath *selectedRowIndex = [self.tableView indexPathForSelectedRow];
        RRObjectViewController *detailViewController = [segue destinationViewController];
        detailViewController.selectedObject = [myAppDelegate.goals  objectAtIndex:selectedRowIndex.row];
    }
}

У меня была та же проблема с методом, который вы использовали, и вместо этого использовал это, он начал работать отлично. Конечно, вам придется адаптировать код к вашему окну viewControllers и источнику данных, потому что я использовал свой AppDelegate в качестве источника данных, и я не использовал пользовательскую ячейку.

Ответ 4

Убедитесь, что вы используете этот метод, а не

deselectRowAtIndexPath:animated