2010-10-20 24 views
32

Tôi đã làm theo đề xuất của Luke Redpath tại đây - Selected UItableViewCell staying blue when selected - để bỏ chọn hàng khi quay lại chế độ xem bảng gốc, nhưng tôi không thể làm cho nó hoạt động. Trong thực tế, phương thức này không được kích hoạt.Bỏ chọn hàng xem bảng khi trở về

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

tôi nghi ngờ điều này là do các lớp không phải là một UITableViewController, nhưng một UIViewController với tableView như một thuộc tính kết nối lên đến NIB.

Làm cách nào để nhận được cùng một hành vi - nghĩa là bỏ chọn khi quay lại?

+0

Nó không quan trọng miễn là tableView được nối chính xác. Bạn có thể đặt nó trong 'didSelectRowAtIndexPath:' và nó hoạt động. Bạn cũng có thể muốn thực hiện kiểm tra NSLog nhanh chóng về những gì '[self.tableView indexPathForSelectedRow]' trả về vì nó thực sự có thể trở về không. – iwasrobbed

+0

Tôi đã sử dụng điều này nhưng đã có một vấn đề mà thay đổi mọi thứ trong tế bào (nền vv) đã không được phản ánh ngay lập tức. Thêm reloadRowsAtIndexPaths: trong didDeselectRowAtIndexPath: đã làm thủ thuật – nh32rg

Trả lời

15

Nếu bạn đang sử dụng một NavigationController, bạn có thể làm điều đó với đại biểu của nó:

- (void)navigationController: (UINavigationController *)navigationController 
     didShowViewController: (UIViewController *)viewController 
        animated: (BOOL)animated 
{ 
    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

Nhưng bạn phải kiểm tra xem các bộ điều khiển chương trình là mà bạn muốn =/

[EDIT] Tạo cửa hàng và liên kết nó trong IB với NavigationController

@interface MyInt <UINavigationControllerDelegate> 
{ 
    IBOutlet UINavigationController *navigation; 
    ... 
} 
@property (nonatomic, retain) UINavigationController *navigation; 
... 
@end 

@implementation MyInt 
@syntesize navigation; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [self.navigation setDelegate: self]; 
} 
... 

@end 
+0

Trình điều khiển nav của tôi được tạo ra trong ngòi của tôi, vì vậy nó không có lớp tương ứng.Có cách nào quanh đây không? – cannyboy

+0

Bạn có thể ánh xạ nó vào một IBOutlet ivar. –

+0

Thiết lập của tôi là tôi đã có một lớp MainViewController với một NIB tương ứng. Nib đó có UITabBarController (cũng là một thuộc tính IBOutlet 'tabBarController' trong MainViewController). Trong thanh tab đó là một vài bộ điều khiển UINavigation. Đây không phải là tham chiếu trong mã. Vì vậy, tôi không chắc chắn làm thế nào để truy cập vào bất kỳ của các bộ điều khiển nav – cannyboy

8

Bạn có chọn hàng theo chương trình không? Nếu vậy, tôi có cùng một vấn đề khi chọn một hàng bằng cách sử dụng [cellToBeSelected setSelected:YES];.

Bằng cách sử dụng phương pháp UITableViewController 's selectRowAtIndexPath:animated:scrollPosition:, nó theo dõi danh sách chỉ mục đã chọn hiện tại.

Thực tế, nếu clearsSelectionOnViewWillAppear được đặt thành true, người ta không bỏ chọn hàng theo cách thủ công.

21

tại sao bạn chỉ không bỏ chọn nó trong phương pháp đại biểu

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

[self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 

} 
+2

Bạn không phải thực hiện '[self.tableView indexPathForSelectedRow]', indexPath đã là một tham số và bạn có thể chèn nó vào đó. –

+0

Ngoài ra, nếu bạn đang sử dụng phương thức ủy nhiệm, bạn nên sử dụng tham số 'tableView' thay vì' self.tableView', vì chúng có thể có khả năng khác nếu bạn có nhiều tableviews. –

8

tôi HADE cùng một vấn đề, nhưng sau khi gỡ lỗi tôi phát hiện ra đếm indexPathForSelectedRow là 0 vì vậy tôi đôi kiểm tra mã của tôi và nhận thấy tôi đã gọi số

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

    // some code... 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

Sau khi xóa dòng này, nó chỉ hoạt động như mong đợi.

+0

Đây là một sai lầm hoàn toàn rõ ràng bắt gặp tôi. Tôi nghĩ rằng rất nhiều người bao gồm cả bản thân tôi bỏ chọn trong các đại biểu ra khỏi thói quen. – micnguyen

4

Rất đơn giản: Hãy thử dòng này.

Thêm deselectRowAtIndexPath trong didSelectRowAtIndexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 

} 
0
-(BOOL)tableView:(UITableView *)tableView shouldHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return YES; 
} 

-(void)tableView:(UITableView *)tableView didHighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor grayColor]]; 
} 

-(void)tableView:(UITableView *)tableView didUnhighlightRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [[tableView cellForRowAtIndexPath:indexPath] setBackgroundColor:[UIColor clearColor]]; 
} 
+0

Vui lòng mô tả lý do tại sao đây là giải pháp. Thay đổi/lừa là gì? –

1

Swift 3,0

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
      tableView.deselectRow(at: indexPath, animated: true) 
    //Write Your Other code Here. 
      } 

Nó sẽ bỏ chọn Row sau khi bạn click vào nó bạn.

Các vấn đề liên quan