2013-04-05 2 views
2

Мне нужно сделать вызов определенного номера при щелчке изображения в tableviewcell. Номер, на который сделан вызов, отображается на метке рядом с изображением. Но я не мог получить, какая ячейка нажата . Всегда ссылается на последнюю ячейку.Обнаружить UIImageView щелкнуть мышью в UITableViewCell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    if(cell == nil) 
    { 
     cell =[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
     lblphone = [[UILabel alloc] initWithFrame:CGRectZero]; 
     lblphone.tag = 116; 
     lblphone.backgroundColor = [UIColor clearColor]; 
     [lblphone setFont:[UIFont fontWithName:@"Helvetica" size:12]]; 
     [lblphone setLineBreakMode:UILineBreakModeWordWrap]; 
     [lblphone setUserInteractionEnabled:YES]; 

     UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(labelButton:)]; 
     tapGestureRecognizer.cancelsTouchesInView=NO; 
     [tapGestureRecognizer setNumberOfTapsRequired:1]; 
     [lblphone addGestureRecognizer:tapGestureRecognizer]; 
     [tapGestureRecognizer release]; 
     [cell addSubview:lblphone]; 

     myImageView = [[UIImageView alloc] initWithFrame:CGRectZero]; 
     myImageView.tag = 120; 
     myImageView.image=[UIImage imageNamed:@"CallImg.png"]; 

     UITapGestureRecognizer *tapped = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(imageSelectedInTable:)]; 
     [tapped setNumberOfTapsRequired:1]; 
     [myImageView addGestureRecognizer:tapped]; 
     [tapped release]; 
     [cell addSubview:myImageView]; 
    } 

    [myImageView setFrame:CGRectMake(10, 50,30,30)]; 
    myImageView= (UIImageView*)[cell viewWithTag:120]; 
    myImageView.image=[UIImage imageNamed:@"CallImg.png"]; 
    myImageView.userInteractionEnabled=YES; 

    CGSize constraint5 = CGSizeMake(320, 2000.0f); 
    CGSize size5=[phone sizeWithFont:[UIFont fontWithName:@"Helvetica" size:14] constrainedToSize:constraint5 lineBreakMode:UILineBreakModeWordWrap]; 
    lblphone =(UILabel *)[cell viewWithTag:116]; 
    [lblphone setFrame:CGRectMake(45,name.frame.size.height+name.frame.origin.y,320, size5.height)]; 
    lblphone.textAlignment=UITextAlignmentLeft; 
    lblphone.backgroundColor=[UIColor clearColor]; 
    lblphone.text=[NSString stringWithFormat:@"%@ ",phone ]; 
    [lblphone sizeToFit]; 
} 

И в tapgesture из imageclick Я пишу это:

-(IBAction)imageSelectedInTable:(UITapGestureRecognizer*)gesture 
{ 
    UIImageView *imgView = (UIImageView *) [gesture view]; 
    UITableViewCell *cell = (UITableViewCell*)[[imgView superview]superview]; 
    NSIndexPath *tappedIndexPath = [self.tableView indexPathForCell:cell]; 
    NSLog(@"Image Tap %@", tappedIndexPath); 
    UILabel *phoneno = (UILabel *)[cell viewWithTag:116]; 

    NSString *phoneNumber = [@"telprompt://" stringByAppendingString:phoneno.text]; 
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:phoneNumber]]; 
} 

Но всегда referncing к последней ячейке щелкнул независимо от того, какая ячейка является clicked.Couldn't понять, где им будет неправильно ?

+0

Сделать пользовательскую кнопку на вашем изображенииПросмотреть и найти путь индекса с помощью сенсорных методов, поэтому не нужно использовать UITapGestureRecognizer в вашем коде. – Apple

ответ

3

Я вижу, вы пытаетесь получить доступ к ячейке,

UITableViewCell *cell = (UITableViewCell*)[[imgView superview]superview]; 

, но вы можете добавить свой снимок в

[cell addSubview:myImageView]; 

Вы должны добавить свой снимок в cell.contentView.

+0

Это очень жизнеспособная альтернатива использованию тегов для хранения индекса строки, как предлагалось @iPatel. Для этого есть два очевидных недостатка, которые необходимо учитывать. 1) Вы не можете использовать его в tableview с разделами. 2) Вы отказываетесь от возможности использовать теги для доступа к различным элементам пользовательского интерфейса внутри contentView. – svena

1

для получения/знать, какие ячейки щелкнул, запись Следующий код

UITableViewCell *cell = (UITableViewCell *)[[imgView superview]superview]; 

и если вы также хотите получить indexPath из повернутой клетки затем написать

NSIndexPath *indexPath = [tableView indexPathForCell:cell]; 

EDITED: -> Еще один способ является

Дайте tag из UIImageView в cellForRowAtIndexPath Метод Такие, как,

imageView.tag = indexPath.row; 

и использовать следующий код

int row = ((UIImageView*)imgView).tag; //Or// int row = ((UIGestureRecognizer *)sender).view.tag; 

NSIndexPath* indexpath = [NSIndexPath indexPathForRow:row inSection:0]; 
UITableViewCell* cell = [table cellForRowAtIndexPath:indexPath]; 

Здесь Вы можете получить Cell из постучала UIImageView.

+0

Но NSIndexpath получает null в моем случае. Что я могу сделать? – Aaradhya

+1

@ Aaradhya-try с этим кодом :) – iPatel

+0

Но я написал это уже в своем коде. Может, и скажите мне, в чем разница, которую я написал, и код ур? – Aaradhya

3

Похоже, что изображение представляет собой подвид ячеек (один шаг вниз по дереву), а код, который исследует родительский элемент, выполняет два шага вверх ... супервизор. (Этот последний подход подходит для nib определенных ячеек, которые добавляют subviews в contentView ячейки).

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

- (UITableViewCell *)tableViewCellContaining:(UIView *)aView { 

    UIView *answer = aView; 
    while (answer && ![answer isKindOfClass:[UITableViewCell self]]) 
     answer = answer.superview; 
    return answer; 
} 

Я думаю, ваш код будет, вероятно, будет работать, если вы замените эту строку:

UITableViewCell *cell = (UITableViewCell*)[[imgView superview]superview]; 

с этой линией

UITableViewCell *cell = [self tableViewCellContaining:imgView] 
Смежные вопросы