TableViewで新たにクリックされたセルのUILabelアップデートの問題 - 最初にクリックされたセルのタイトルが保持される

私はiOS開発をかなり新しくしていますが、広範な検索の後にまだこれを修正する必要がありません。

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

これはリリース/保持の問題、またはテーブルのreloadDataの問題ですが、どこにオブジェクトやテーブルを追加しようとしても、DetailViewControllerの "currentNodeTitle"を新しくクリックされたセルにリセットすることはありませんUILabel。

ここに私のセットアップです:

私はnodeTitlesと呼ばれるNSMutableArrayから作成されたセルを持つテーブルを持っています。

配列データのNSLog出力は nodeTitles:(     問題、     「第2号」     「第3号」     「第4号」     「第5号」     「第6号」     「第7号」 )

In MasterViewController.h:

@class DetailViewController;

@interface MasterViewController : UITableViewController {
    NSMutableArray * nodeTitles;
}

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

In 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、viewWillDissearは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  {
    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];
}

DetailViewController.m のviewDidLoadで、UILabel項目を次のように設定しています。

- (void)viewDidLoad
{
    [super viewDidLoad];

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

    [self configureView];    
}

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

アイテムをクリックした後、マスターコントローラをクリックして、DetailViewController上のUILabelに新しく選択したセルタイトルを表示させるにはどうしたらいいですか?

ありがとう〜

0
あなたの質問を指定し、何をしたいか教えてください。
追加された 著者 Emon,

2 答え

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

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

EDIT
You are retaining the detailViewController, so it looks like viewDidLoad is being called only once and that is the only place where you use the currentNodeTitle.

移動してみてください

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

viewWillAppear:detailViewControllerを押すたびに呼び出されるためです。

1
追加された
私は自分の答えを更新しました。それが動作するかどうかを確認します。
追加された 著者 NSIntegerMax,
私はこの変更を成功させなかった。最初のセルを選択した後にセルを再選択すると、クリックされた最初のセルのUILabelタイトル情報が使用されます。 - 他のアイデア?私はそれがどこかでリリースされなければならないと思います。
追加された 著者 Pat,
これは、大きな巨大な感謝を働いた!もし私がもっと多くのポイントを持っていたら、あなたは+50になるでしょう!
追加された 著者 Pat,

When you are making your new label then just reload the table. One think also you should follow that, make a label in the if(cell == nil) { [cell.contentView addSubview:label]; } then make tag of this label then after this condition review the label label = (UILabel*)[cell.contentView viewWithTag:labeltag]

それはあなたの問題に役立つことがあります。

0
追加された
エモン、私はあなたの解決策を理解するのに困っていた。私はすでにdetailLabelItemを - (void)viewWillAppear:(BOOL)animatedに設定するDetailViewController.mコードを追加することで、これを動作させました。それでも、あなたの返事をありがとう
追加された 著者 Pat,