簡體   English   中英

UITableView didSelectRowAtIndexPath 未被調用

[英]UITableView didSelectRowAtIndexPath not being called

我有一個帶有 UITableView 的視圖控制器。 我將數據源和委托都設置為視圖控制器。 方法 cellForRowAtIndexPath: 正在被調用並按預期運行,但是 didSelectRowAtIndexPath: 沒有被調用。 任何想法這里發生了什么?

我的 .h 中有這個:

@interface DetailViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

在我的 viewDidLoad 在 .m 我有:

self.tableView.dataSource=self;
self.tableView.delegate=self;

將調用 cellForRowAtIndexPath 但不調用 didSelectRowAtIndexPath 似乎沒有意義。這就是該方法現在的樣子:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    NSLog(@"did select row at index path");
}

我遇到了一些可能的原因:

  1. 確保 tableView 的編輯屬性設置為 NO。 當表的編輯屬性設置為 YES 時,不會調用didSelectRowAtIndex: 方法 默認情況下,此屬性設置為 NO。

     self.tableView.editing = NO;
  2. 確保allowsSelection 屬性設置為YES。 默認情況下是。

  3. 試着打電話。 [super viewDidLoad]在 viewDidLoad 方法中或在 init 初始化器中設置委托和數據源屬性。

  4. loadView方法中設置delegate 和dataSource 屬性,並將tableView 分配給UIViewController 的view 屬性。 下面是一個例子:

     - (void)loadView { UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain]; tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth; tableView.delegate = self; tableView.dataSource = self; [tableView reloadData]; self.view = tableView; }
  5. (這實際上是我通常做的)嘗試從 UITableViewController 繼承 DetailViewController ,它也繼承自 UIViewController 。 UITableViewController 自動符合 UITableViewDelegate 和 UITableViewDataSource。

視圖控制器視圖上的手勢識別器阻止了觸摸,通過將手勢識別器的cancelsTouchesInView設置為 false 來解決。

就我而言,我使用了 UITapGestureRecognizer,它對我來說就像魔法一樣。

cell.tag=indexPath.row; 
UITapGestureRecognizer* tap=[[UITapGestureRecognizer alloc]initWithTarget:self action:@selector(tapOnCell:)]; 
[cell addGestureRecognizer:tap];

這是我的 tapOnCell 方法實現

-(void)tapOnCell:(UITapGestureRecognizer*)tap
{
   ADPointCashTransaction* aTransaction=[transactionArray objectAtIndex:tap.view.tag];
    // Work with aTransaction Object
}

將答案放在 seto nugroho 的評論中,以及我解決該問題的工作。 如果 tableView 中有手勢識別器,則不會調用 didSelect 行。 您可以做的是將手勢識別器的點擊次數增加到兩次。

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))
gestureRecognizer.numberOfTapsRequired = 2
view.addGestureRecognizer(gestureRecognizer)`  

我再添加一個:確保您沒有任何其他視圖與表格或單元格重疊,即使是隱藏的。 如果這樣做,請在情節提要中禁用“啟用用戶交互”,除非您明確需要通過視圖捕捉手勢。

就我而言,我在后台線程中分配了 dataSource 並調用了 reloadData() 。 因此,請確保您在主線程上執行此操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM