2011-12-18 7 views
0

私はiOS開発の新機能ですが、TableViewで新しくクリックされたセルのUILabelアップデートの問題 - 最初にクリックされたセルのタイトルが保持されます

テーブルセルをクリックすると、タイトル情報(インデックスの配列から作成)が詳細ビューコントローラのUILabelに送信されるという問題があります。 MasterViewController TableViewCellsをクリックして別のセルを選択すると、そのタイトルはUILabelに渡されず、前または最初の項目のクリックされた情報が保持されます。

これは解放/保持の問題、またはテーブルのreloadDataの問題ですが、オブジェクトやテーブルのどこにこれらを追加しようとも、DetailViewControllerの「currentNodeTitle」を新たにクリックされたセルにリセットしませんそれを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 

I n MasterViewController.m:

アレイから、各インデックス付き行の内容で各セルが作成されます。

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

cellForRowAtIndexPath:didSelectRowAtIndexPathためのその後

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

- (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にリンクしました。

MasterViewControllerで私のDEALLOC、viewDidUnload、viewWillAppear、viewDidAppearとviewWillDissappear:

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

マイ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?

感謝〜

+0

質問を指定して、何をしたいか教えてください。 – Emon

答えて

1
if (!self.detailViewController) { 
    self.detailViewController.currentNodeTitle = [nodeTitles objectAtIndex:indexPath.row]; 
} 

私はdetailViewControllerが有効であるため、このIF文が再び実行されていないと思います。 IFブロックからcurrentNodeTitle割り当てを移動します。

EDIT
あなたはdetailViewControllerを保持しているので、のviewDidLoadは一度だけ呼び出されているように見えますし、それはあなたがcurrentNodeTitleを使用する唯一の場所です。

はviewWillAppearに

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

を移動してみてください:それはあなたがdetailViewControllerを押すたびに呼び出されますので、。

+0

私はこの変更を成功させずに行いました。最初のセルが選択された後にセルを再選択すると、クリックされた最初のセルのUILabelタイトル情報が使用されます。 - 他のアイデア?私はそれがどこかでリリースされなければならないと思います。 – Pat

+0

答えを更新しました。それが動作するかどうかを確認します。 – NSIntegerMax

+0

これは、大きな巨大な感謝の仕事!もし私がもっと多くのポイントを持っていたら、あなたは+50になるでしょう! – Pat

0

新しいラベルを作成するときに、テーブルをリロードするだけです。あなたはそれに従わなければならないと考えて、if(cell == nil) { [cell.contentView addSubview:label]; }のラベルを作成し、この状態の後にこのラベルのタグを作成した後、label = (UILabel*)[cell.contentView viewWithTag:labeltag]

となる場合があります。

+0

Emon、私はあなたの解決策を理解することができませんでした。私はすでにdetailLabelItemを - (void)viewWillAppear:(BOOL)animatedに設定するDetailViewController.mコードを追加することで、これを動作させました。それでも、あなたの返事をありがとう – Pat

関連する問題