0

私は本当に奇妙な問題を抱えています。

私のtableViewには、すべてのデリゲートとデータソースが設定されています。

すべて順調。

ただし、行をクリックしてもアクティブになりません。

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

カスタムセルを使用しました。

クリックしてクリックしてクリックしてクリックしてから、時々それが通過します。

何が原因なのだろうか?customCell がタッチ イベントまたは何かを「吸収」しているように見えますか?

それが理由でしょうか?もしそうなら、customCell を実装し、tableView にタッチアップ イベントを処理させたい場合、どうすればよいでしょうか?

追加の症状:

カスタムセルから有効なユーザー操作を削除すると、問題はキャッチで解決されます。

ここに画像の説明を入力

ただし、ボタンをクリックすると、何らかの理由で 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 ロード用の追加コード。

NIB を viewDidLoad ルーチンに登録するだけです。

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

そして、 cellForRowAtIndexPath で次のように呼び出します。

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

XIB からセルをロードします (または、以前に使用したキューからセルを取得します)。

于 2012-10-14T19:49:30.363 に答える
1

使用する代わりに、インターフェイスを処理するためにストーリーボードを使用している場合:

-(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];
    }
}

私はあなたが使用した方法で同じ問題を抱えていましたが、代わりにこれを使用しました。完全に機能し始めました。もちろん、AppDelegate をデータソースとして使用し、カスタム セルを使用していなかったため、コードをアプリの viewController とデータ ソースに適合させる必要があります。

于 2012-10-14T20:03:33.987 に答える
0

問題が何であるかを理解したと思うが、まだそれを完全に解決できないことを更新したいだけです。そして、アップデートは包括的であるため、答えになるはずだと思いますが、パズルがまだ欠けているため、答えではないことを願っています.

すべての問題は相互に関連しています。

問題は次の行にあります。

[self addSubview:self.view]; 

私は基本的にそれを次のように変えます:

基本的に、私のカスタム ビュー セルには、タイプも tableViewCell のビューがあります。そのビューは、実際の tableViewCell をカバーしています。

そのため、ユーザーの操作が有効になっている場合、そのビューはユーザーの操作を吸収します。

それがラベルが「消える」理由でもあります。何が起こるかというと、ラベルが消えません。ラベルが強調表示され、白くなりました。ただし、強調表示されているのは、不透明なビューではなく tableViewCell です。白い不透明な self.view はまだ白いままですが、tableCell 自体は青く着色されています。そのため、白い背景の真ん中でラベルが白くなり、消えてしまいます。

[self addSubview:self.view] を self= self.view に置き換えるべきだと思います

しかし、それは自己の価値を変えることを意味します。はい、それは初期化されています。しかし、それはまだ厄介です。UI のカスタム サブクラスを XIB で実装する方法を誰かが持っているなら、それは素晴らしいことです。

気まずい。

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 をサブクラス化するときに、contentView のサブビューを移動する必要があるという問題があります。理由は誰にもわかりません。

最後に、self.view を nil に設定するだけです。不要になったため、プログラムは期待どおりに動作します。

また、tableViewCell の背景を設定するには、self.view ではなく self.contentView の背景も設定する必要があります。

試すことができる別のアプローチは、ストーリー ボードを使用することです。または、self.view の contentView を self に移動することもできます。

于 2012-10-15T02:23:11.410 に答える
-1

そのメソッドを実装していることを確認してください。

deselectRowAtIndexPath:animated
于 2012-10-14T19:29:42.683 に答える