2013-06-03 5 views
5

Я использую этот метод, чтобы добавить UILabel в мой UITableView и его рабочий тон, но мне также нужно создать метод выбора строки и сохранения в temp String.didSelectRowAtIndexPath for Custom label Cell

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
          reuseIdentifier:CellIdentifier]; 

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,10, 300, 30)]; 
    [cell.contentView addSubview:label]; 
    label.text = [tableArr objectAtIndex:indexPath.row]; 
    label.font = [UIFont fontWithName:@"Whitney-Light" size:20.0]; 
    return cell; 
} 

но его не работает. Он отлично работал, когда я использовал cell.textLabel, но не с пользовательской меткой.

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

    UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath]; 
    UILabel *lbltemp = cell1.textLabel; 

    _parent.labelone.text = lbltemp.text;  
} 

ответ

10

Вы можете создать свой собственный UITableViewCell подкласс, чтобы позволить вам получить ссылку на наклейку (и позволят вам создать несколько ярлыков на ячейке). Или вы могли бы использовать тег, как это:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{  
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (cell = nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
         reuseIdentifier:CellIdentifier]; 

     UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,10, 300, 30)]; 
     label.tag = 123123; 
     [cell.contentView addSubview:label]; 
    } 

    UILabel *label = (UILabel *)[cell viewWithTag:123123]; 
    label.text = [tableArr objectAtIndex:indexPath.row]; 
    label.font = [UIFont fontWithName:@"Whitney-Light" size:20.0]; 

    return cell; 
} 

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

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    UILabel *label = (UILabel *)[cell viewWithTag:123123]; 

    _parent.labelone.text = label.text;  
} 

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

Кроме того, вы не должны хранить текст в ярлыке, вы должны действительно указать свой tableArr, чтобы получить текст. Подход тегов более подходит для обновления метки при повторном использовании ячейки или если вы позволяете пользователю редактировать текст (в UITextField).

2

Проблема cell1.textLabel не является меткой, которую вы создали. Это просто ярлык по умолчанию, созданный ячейкой.

Решение может быть:

Добавить тег к наклейке при создании пользовательского элемента.

Say label.tag=100;

В didSelectRow,

Использование

UILabel *lbltemp=(UILabel *)[cell1.contentView viewWithTag:100]; 

затем _parent.labelone.text=lbltemp.text; should захватить ваш текст с этой меткой.

2

Причина, по которой она не работает, заключается в том, что вы не ссылаетесь на пользовательскую метку в didSelectRowAtIndexPath. Самый простой способ, чтобы получить ссылку на персонализированных этикетки с помощью тегов:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{  
    static NSString *CellIdentifier = @"Cell"; 

    // Also, this is the proper way to use reuseIdentifier (your code is incorrect) 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (!cell) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
          reuseIdentifier:CellIdentifier]; 
    } 

    UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(10,10, 300, 30)]; 
    [cell.contentView addSubview:label]; 

    label.text = [tableArr objectAtIndex:indexPath.row]; 
    label.font = [UIFont fontWithName:@"Whitney-Light" size:20.0]; 
    label.tag = 1; 

    return cell; 
} 

- (void) tableView: (UITableView *) tableView didSelectRowAtIndexPath: (NSIndexPath *)indexPath { 
    UITableViewCell *cell1 = [tableView cellForRowAtIndexPath:indexPath]; 
    UILabel *customLabel = [cell viewWithTag:1]; 
    _parent.labelone.text = customLabel.text;  
} 
0

Здесь ([cell.contentView addSubview: label]; _) вы создаете свой пользовательский ярлык и добавляете его как подвью к представлению содержимого ячейки, но в UILabel * lbltemp = cell1.textLabel; вы пытаетесь получить доступ к метке по умолчанию для ячейки tableview. Добавьте какой-нибудь идентификатор (например, тег) на свой ярлык и получите доступ к нему в файле didSelectRowAtIndexPath.

0

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

cell.textLabel.frame = CGRectMake(10,10, 300, 30); 

Кроме того, это лучше для памяти для повторного использования в качестве клеток в ответ

0

использование cell.indentationallevel или cell.indentationwidth WAIN в