Проблема обновления UILabel для вновь выбранных ячеек в TableView - сохраняется название первого щелчка - PullRequest
0 голосов
/ 19 декабря 2011

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

Проблема в том, что при щелчке по ячейке таблицы ее информация заголовка (построенная из массива по индексу) отправляется в UILabel на контроллере представления сведений. Затем после щелчка обратно на MasterViewController TableViewCells и выбора другой ячейки, ее заголовок не передается в UILabel, и информация о ранее или первом щелчке по элементу сохраняется.

Это может быть проблема освобождения / сохранения или проблема с таблицей reloadData, но независимо от того, где я пытаюсь добавить их для своих объектов или таблицы, она не будет сбрасывать «currentNodeTitle» в DetailViewController в ячейку, по которой щелкнули ранее, отправив его UILabel.

Вот мои настройки:

У меня есть таблица с ячейками, созданными из NSMutableArray с именем nodeTitles.

Вывод NSLog данных массива nodeTitles: ( Проблема, «Выпуск 2», «Выпуск 3», «Выпуск 4», «Выпуск 5», «Выпуск 6», «Выпуск 7» )

В MasterViewController.h:

@class DetailViewController;

@interface MasterViewController : UITableViewController {
    NSMutableArray * nodeTitles;
}

@property (strong, nonatomic) DetailViewController *detailViewController;
@property (nonatomic, retain) NSMutableArray *nodeTitles;    
@end

В MasterViewController.m:

Из массива создается каждая ячейка с содержимым каждой индексированной строки.

nodeTitles = [[NSMutableArray alloc]initWithObjects:@"Issue", @"Issue 2",@"Issue 3", @"Issue 4", @"Issue 5", @"Issue 6", @"Issue 7", nil];

cellForRowAtIndexPath:

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

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }
}

//*only thing added*
cell.textLabel.text = [self.nodeTitles objectAtIndex: [indexPath row]];
//*end only thing added*

return cell;}

Затем для didSelectRowAtIndexPath :

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        if (!self.detailViewController) {
            self.detailViewController = [[[DetailViewController alloc] initWithNibName:@"DetailViewController_iPhone" bundle:nil] autorelease];

        self.detailViewController.currentNodeTitle = [nodeTitles objectAtIndex:indexPath.row];
        //[contentTitleArray release];

    }
        [self.navigationController pushViewController:self.detailViewController animated:YES];
    }
}

На данный момент все работает. У меня есть список ячеек табличного представления с содержимым из моего массива, и при щелчке я связал их с UILabel.

My Dealloc, viewDidUnload, viewWillAppear, viewDidAppear и viewWillDissappear в MasterViewController:

- (void)dealloc
    {
      [self.nodeTitles release];
      [_detailViewController release];
      [super dealloc];
    }
- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
    self.nodeTitles = nil;
}

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    [self.tableView reloadData];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.tableView reloadData];
}

My DetailViewController.h:

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate> {
    IBOutlet UILabel *detailDescriptionLabel;
    NSMutableString *currentNodeTitle;
}

@property (strong, nonatomic) id detailItem;

@property (nonatomic, retain) IBOutlet UILabel *detailDescriptionLabel;
@property (nonatomic, retain)NSMutableString *currentNodeTitle;

@end

DetailViewController.m

@interface DetailViewController ()
@property (strong, nonatomic) UIPopoverController *masterPopoverController;
- (void)configureView;
@end

@implementation DetailViewController

@synthesize detailItem = _detailItem;
@synthesize detailDescriptionLabel = _detailDescriptionLabel;
@synthesize masterPopoverController = _masterPopoverController;
@synthesize currentNodeTitle;

- (void)dealloc
{
    currentNodeTitle = nil;
    [_detailItem release];
    [_detailDescriptionLabel release];
    [_masterPopoverController release];
    [super dealloc];
}

В viewDidLoad на DetailViewController.m я устанавливаю элемент UILabel с помощью:

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.title = currentNodeTitle;
    _detailDescriptionLabel.text = currentNodeTitle;

    [self configureView];    
}

- (void)viewDidUnload
{
    [super viewDidUnload];
   [currentNodeTitle release];
}

После нажатия на элемент и возврата назад к главному контроллеру, как я могу получить вновь выбранный заголовок ячейки для отображения в UILabel на DetailViewController?

спасибо ~

Ответы [ 2 ]

1 голос
/ 19 декабря 2011
if (!self.detailViewController) {
    self.detailViewController.currentNodeTitle = [nodeTitles objectAtIndex:indexPath.row];
}

Я думаю, что этот оператор IF не выполняется снова, так как detailViewController является допустимым. Переместите присвоение currentNodeTitle из блока IF.

EDIT
Вы сохраняете detailViewController, поэтому похоже, что viewDidLoad вызывается только один раз, и это единственное место, где вы используете currentNodeTitle.

Попробуйте переместить

self.title = currentNodeTitle;
_detailDescriptionLabel.text = currentNodeTitle;

to viewWillAppear: так как он будет вызываться каждый раз, когда вы нажимаете detailViewController.

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

Когда вы создаете новый ярлык, просто перезагрузите таблицу.Можно подумать также, что вы должны следовать этому, сделайте метку в if(cell == nil) { [cell.contentView addSubview:label]; }, затем сделайте метку этой метки, а затем, после этого условия, проверьте метку label = (UILabel*)[cell.contentView viewWithTag:labeltag]

, тогда это может помочь вашей проблеме.

...