2011-07-11 8 views
9

私のアプリには複数のテーブルビューがあります。私はテーブルの通常の動作に精通しています。行を選択してプッシュされたビューに進むと、青色に変わり、その後に戻ってくると、それは2秒間青色のままで、次に白にフェードしてユーザーに通知しますどの行が選択されたのかを示します。私はなぜわかりませんが、後に...それは二その分割のための青い滞在しなかった返品時にUITableViewで行が選択されない

を:

は、これは私が気づいたときに、それはもはや私が説明したものの最後のビットをした最近まで完全に働いていませんこのサイトのいくつかの関連する記事を読んで、私はそのコードが "viewDidAppear"メソッドに呼び出されることに気付きました。私が混乱しているのは、このメソッドをオーバーライドしないことですが、NSLogを使ってテストして、選択解除すべき行のインデックスパスを表示しました。これはnullを返しました。

これは、何とか、tableViewが途中で行の選択を解除していると私に信じさせています。私のようだ....私はそれが働いてしまった

修正:、ありがとう:)


EDITすべてのヘルプは大歓迎です

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"Selected row at index path: %@", indexPath); 

    //setting our view controller as what we want 
    TripDetails *detailViewController = [[TripDetails alloc] initWithNibName:@"TripDetails" bundle:nil]; 
    self.tripsDetailViewController = detailViewController; 
    [detailViewController release]; 


// Pass the selected object to the new view controller. 
    NSLog(@"Passing trip..."); 
    self.tripsDetailViewController.selectedTrip = [fetchedResultsController objectAtIndexPath:indexPath]; 

    //Hide the bottom bar on pushed view 
    tripsDetailViewController.hidesBottomBarWhenPushed = YES; 

    [self.navigationController pushViewController:tripsDetailViewController animated:YES]; 

} 

:以下

は私のdidSelectRowForIndexPath方法であります私のviewWillAppearメソッドで[self.tableView reloadData]メソッドを呼び出すと、テーブルがすべてのセルの選択を解除しました。以下は私の修正したviewDidLoadメソッドです。提案していただきありがとうございます!

- (void)viewWillAppear:(BOOL)animated 
{ 
NSLog(@"running viewWIllAppear for TripsTable"); 

//Getting indexpath for highlighened cell, to rehighlight 
NSIndexPath *selectedIndex = [self.tableView indexPathForSelectedRow]; 

//Refreshing Table - Implement an if statement on the condition that the data has  changed 
[self viewDidLoad]; 
[self.tableView reloadData]; 

//Re select cell 
[self.tableView selectRowAtIndexPath:selectedIndex animated:NO scrollPosition:UITableViewScrollPositionNone]; 


[super viewWillAppear:animated]; 
} 
+1

ショット良い作品を行います。これはこの動作につながる可能性があります。 – dasdom

答えて

9

行の選択を解除するための

[tableView deselectRowAtIndexPath:indexPath animated:NO];

を試して、

[tableView selectRowAtIndexPath:indexPath animated:NO]; 

選択された行を強調表示します。

1

使用テーブルビューのdidSelectRowAtIndexPathデリゲートメソッドの最後のコードのこの作品は、クラスのUITableViewの

[tableView deselectRowAtIndexPath:indexPath animated:NO]; 
2

明らかviewWillAppear:も、細胞をリロードせずに、すべてのセルの選択を解除しません。説明トリックは私の仕事:私のUITablViewControllerから

コード:

- (void)viewWillAppear:(BOOL)animated 
{ 
    NSIndexPath *selectedIndex = [self.tableView indexPathForSelectedRow]; 

    [super viewWillAppear:animated]; 

    //Re select cell 
    [self.tableView selectRowAtIndexPath:selectedIndex animated:NO scrollPosition:UITableViewScrollPositionNone]; 
}; 
+0

それは私が疑っていたことです...自分自身に注意してください:再びUITableViewControllerを使用しないでください! :p – Giovanni

+1

これは間違っており、元に戻す必要があります。それはclearsSelectionOnViewWillAppearによって制御され、上記の@ jankoenの答えを参照してください(そして私のコメント) –

29

そのあなたはオフにすることができます機能を。

のUITableViewControllerでは、

[ self setClearsSelectionOnViewWillAppear:NO ]; 

これは、ファイル "UITableViewController.h" から直接で呼び出すことができます。この機能は、この文書に記載されています。

@property(nonatomic) BOOL clearsSelectionOnViewWillAppear __OSX_AVAILABLE_STARTING(__MAC_NA, __IPHONE_3_2); 
// defaults to YES. If YES, any selection is cleared in viewWillAppear: 
+0

ありがとう、これは私のためにそれをした! – Mike

+0

私は 'UITableView'ヘッダでこのプロパティを見つけようとしていました:/ – rounak

+2

Xcode 6.3/iOS 8.3以降、この設定はIB/storyboards/XIBsで設定しても保持されません。ボックスをチェックすることはできますが、正しく初期化されていません。常にtrueに設定されます。 –

0
NSIndexPath *_selectedIndex ; 

テーブルビューデリゲートメソッド

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
_selectedIndex = [self.tableView indexPathForSelectedRow]; 
} 

UINavigationControllerデリゲートメソッド

- (void)navigationController:(UINavigationController *)navigationController didShowViewController:(UIViewController *)viewController animated:(BOOL)animated 
{ 
[self.tableView selectRowAtIndexPath:_selectedIndex animated:NO scrollPosition:UITableViewScrollPositionNone]; 

} 
0

次のデリゲートに私はで選択して保存するために上記のグローバル変数を使用しますこれが関連しているかどうかはわかりませんが、UITableViewControllerにフラグがあります。 ticedと呼ばれています

@property(nonatomic) BOOL clearsSelectionOnViewWillAppear NS_AVAILABLE_IOS(3_2); // defaults to YES. If YES, any selection is cleared in viewWillAppear: 

これは人々がここで説明している問題のいくつかを解決するはずです。多分前のビューコントローラが原因で、メモリ使用量のアンロードされています

0

次のコードでは、暗闇の中で

-(void)viewWillAppear:(BOOL)animated{ 
     [super viewWillAppear:YES]; 
     [self setClearsSelectionOnViewWillAppear:NO ]; 
    } 
関連する問題