0

我遇到了一个非常奇怪的问题。

我的 tableView 设置了所有委托和数据源。

一切安好。

但是,单击行不会激活:

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

我使用了自定义单元格。

在我单击并单击并单击并单击并单击后,有时它会通过。

我想知道什么可能导致这种情况?就好像 customCell 正在“吸收”触摸事件或其他什么?

这可能是为什么?如果是这样,如果我们要实现 customCell 并且希望 tableView 处理 touch up 事件,我们应该怎么做?

附加症状:

如果我从自定义单元格中删除启用的用户交互,那么问题就可以通过捕获来解决。

在此处输入图像描述

但是,单击该按钮会以某种方式清除 customCell 中的所有标签文本。

在此处输入图像描述

自定义 Cell 的实现如下:

- (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's 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's 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,我仍然看不到我在代码中的哪个位置指定所有标签文本都应该是白色的。

毕竟,选择的是单元格,而不是标签。该标签怎么知道它必须变白,这超出了我的理解。

4

4 回答 4

1

最有可能的是自定义单元格中的视图正在吸收触摸。有时这正是您想要的,例如,一个按钮可以做某事,而不是选择整个单元格。假设您不想要这个,那么只需将这些视图的 userInteractionEnabled 属性设置为 NO。

--自定义NIB加载的附加代码。

您所要做的就是在您的 viewDidLoad 例程中注册 NIB:

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

然后在你的 cellForRowAtIndexPath 中调用:

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

它会从您的 XIB 中加载一个单元格(或者从之前使用的队列中给您一个单元格)。

于 2012-10-14T19:49:30.363 回答
1

如果您使用 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 作为数据源,而且我没有使用自定义单元格。

于 2012-10-14T20:03:33.987 回答
0

我只是想更新一下,我认为我已经弄清楚了问题所在,但仍然不能完全正确地解决这个问题。而且更新是全面的,所以我认为它应该是一个答案,尽管我希望它不是答案,因为仍然缺少一些谜题。

所有的问题都是相互关联的。

问题出在这一行:

[self addSubview:self.view]; 

我基本上把它变成:

基本上,我的自定义视图单元格有一个类型也是 tableViewCell 的视图。该视图覆盖了真正的 tableViewCell。

这就是为什么当启用用户交互时,该视图将吸收用户的交互。

这也是标签“消失”的原因。发生的事情是标签不会消失。标签突出显示并变为白色。但是,突出显示的是 tableViewCell 而不是不透明的视图。白色的不透明 self.view 仍然是白色的,而 tableCell 本身是蓝色的。所以标签在白色背景中间变成白色并且消失了。

我想我应该将 [self addSubview:self.view] 替换为 self=self.view

然而,这将意味着改变自我的价值。是的,它在初始化中。但这仍然很尴尬。如果有人有办法用 XIB 实现 UI 的自定义子类,那就太好了,因为我到目前为止还没有找到。

尴尬的。

我想知道我们是否可以绘制一个指向 XIB 的指针并指定出口是 self 本身。

如果失败,我会将 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 时,我应该移动 contentView 的子视图。谁知道为什么。

最后我只是将 self.view 设置为 nil ,因为它不再需要并且我的程序按预期工作。

另外要设置tableViewCell的背景,你还需要设置self.contentView的背景而不是self.view。

您可以尝试的另一种方法是使用故事板。或者,您可以将 self.view 的 contentView 移动到 self。

于 2012-10-15T02:23:11.410 回答
-1

确保您正在实施该方法而不是

deselectRowAtIndexPath:animated
于 2012-10-14T19:29:42.683 回答