Невозможно получить значение из UITableViewCell с помощью методов самоопределения - PullRequest
1 голос
/ 14 декабря 2011

Я создаю приложение, в котором у меня есть UITableView, а в табличном представлении каждая ячейка имеет UIView, а UIView содержит два пользовательских UIButton и два UILabel (все с одинаковым тегом), значение метки, полученное при разборе XML.Теперь мне нужно сделать следующее: когда я нажимаю любую кнопку, она вызывает метод с тегом кнопки, а затем я хочу получить значение обеих меток этой ячейки и использовать это значение.

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

Есть ли способ получить значениечто?

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

-(void)swapButtonPressed:(id)sender {
    NSInteger a= [sender tag];

    UITableViewCell *cell; 
    NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [[sender superview] superview]];
    NSLog(@"%d", indexPath.row);

    UIView *viewForCell = (UIView *)[cell.contentView viewWithTag:a];

    UILabel *label = (UILabel *)[viewForCell viewWithTag:a];
    NSString *str = label.text;
}

код метода cellForRowAtIndexPath ....

- (UITableViewCell *)tableView:(UITableView *)tableView1 cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *identifier = @"Cell";
    UITableViewCell *cell = [tableView1 dequeueReusableCellWithIdentifier:identifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;
    NSDictionary *dict = [appDelegate.webDataList objectAtIndex:indexPath.row];

    tableView.backgroundColor = [UIColor colorWithRed:0.39 green:0.39 blue:0.39 alpha:0.39];

    if([appDelegate.dataArray count]>0){

        imgView.backgroundColor = [UIColor clearColor];
        imgView =[[UIView alloc ] initWithFrame:CGRectMake(0,0,320,45)];
        imgView.tag= indexPath.row;
        [cell.contentView addSubview:imgView];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(291, 5, 19, 21);
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        button.tag= indexPath.row;
        [imgView addSubview:button];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(-25, 5, 19, 21);
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"swap_re" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(swapButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        button.tag= indexPath.row;
        [imgView addSubview:button];

        button=[UIButton buttonWithType:UIButtonTypeCustom];
        button.frame=CGRectMake(5, 7, 19, 21);
        button.tag = indexPath.row;
        img =[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"delete" ofType:@"png"]];
        [button setBackgroundImage:img forState:UIControlStateNormal];
        [button addTarget:self action:@selector(deleteButtonPressed:) forControlEvents:UIControlEventTouchUpInside];    
        [imgView addSubview:button];

        NSArray *arr = [[appDelegate.dataArray objectAtIndex:indexPath.row] componentsSeparatedByString:@"/"];


        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(34,9,140,20)];
        label.text = [arr objectAtIndex:1];
        label.tag = indexPath.row;
        [label setFont:[UIFont fontWithName:@"Georgia" size:14]];
        [label setNumberOfLines:0];
        label.textAlignment = UITextAlignmentLeft;
        label.textColor = [UIColor whiteColor];
        label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        label.backgroundColor = [UIColor clearColor];
        [imgView addSubview:label];
        [label release];


        label = [[UILabel alloc] initWithFrame:CGRectMake(181, 7, 75, 20)];
        label.tag = indexPath.row;
        label.text = [dict1 objectForKey:@"time"];
        [label setFont:[UIFont fontWithName:@"Georgia" size:16.0]];
        label.textAlignment = UITextAlignmentLeft;
        [label setBackgroundColor:[UIColor clearColor]];
        label.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [label setTextColor:[UIColor whiteColor]];
        [imgView addSubview:label];
        [label release];
    }
    return cell;
}

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Я вижу две проблемы:

  1. Теги должны быть> 0, чтобы вы не могли использовать indexPath.row напрямую.

  2. Метки должны быть уникальными в суперпредставлении

Как подсказывает @Kenny, получение indexPath из ячейки и прямой доступ к источнику данных обычно более надежны. Если вы хотите получить значения из объектов в ячейке, используйте уникальные теги> 0. Я обычно определяю перечисление для тегов в подпредставлении, чтобы сделать вещи более читабельными.

0 голосов
/ 14 декабря 2011

Я думаю, что viewWithTag является рекурсивным, поэтому в вашем коде это будет означать, что вы получите метку обратно при первом обращении к ней и ноль при втором вызове. Так что, возможно, это будет работать:

UILabel *label = (UILabel *)[cell.contentView viewWithTag:a];
NSString *str = label.text;

Тем не менее, я бы порекомендовал вам получить значение из вашего модельного объекта, где вы, вероятно, получили его, когда вы сначала задали строку на кнопке, примерно так:

NSIndexPath *indexPath = [self.tableView indexPathForCell:(UITableViewCell *) [[sender superview] superview]];
TheObect *obj = [myobjects objectAtIndex:indexPath.row];
NSString *string = obj.name;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...