didSelectRowAtIndexPath在非常罕见的情况下被调用或者不被调用大多数时间

时间:2013-06-13 10:05:06

标签: iphone ios uitableview

所以再一次着名的话题。我不得不说我已经在这里阅读了所有类似的主题并且也用Google搜索了它。但没有任何帮助 我的应用程序结构如下: RootControllerTabController,然后每个标签都有自己的NavigationController,里面有ViewController。在ViewController中我放置了一个UITableView。全部采用IB设计。 DataSourceDelegate已正确连接。 TableView使用自定义TableCell,但我也尝试过标准TableCell。还有UISegmentedControl来更改DataSource数组
我检查并仔细检查了(简言之,我在类似主题中找到的所有内容):

  • 我的ViewController确实声明并实施UITableViewDelegateUITableViewDataSource(或者无法连接IB中的相应属性)
  • DataSourceDelegate属性在IB中正确连接。此外,它在代码中被setDelegate:selfsetDataSource:self重复。
  • 我的自定义TableCell已标记用户互动已启用
  • 我的自定义TableCell包含2个标签和一个未启用用户交互标记的图像
  • 它调用[tableView reloadData]
  • 尝试[tableView becomeFirstResponder]
  • TableView具有选择单个单元格,允许用户交互,编辑时允许单元格选择等标记
  • 的选项
  • didSelectRowAtIndexPath中没有像DEselect那样的拼写错误。此外,TableView的委托方法是通过改变代码内部方法的工作应用程序进行复制的。我的意思是方法名称/声明中没有任何拼写错误。
  • didSelectRowAtIndexPath方法只包含一个代码行,而且是NSLog(@"didSelectRowAtIndexPath");
  • XCode多次重启
  • 制作了clean all targets
  • 未使用项目中的ARC
  • 显示表格时没有繁重的操作或任何其他操作

TableView本身在填充数据和显示数据方面表现良好。但是,如果我点击它突出显示的单元格为蓝色,它看起来像冻结了选择。从突出显示一个单元格的那一刻起,任何其他单元格都无法突出显示,并且突出显示的单元格无法取消选中。 didSelectRowAtIndexPath未被调用。但是如果试图通过拖动表格多次敲击单元格,那么有时该方法会调用。就像在非常罕见的情况下被调用一样,如果表中的记录不超过3个。这是一个非常奇怪的问题,我无法抗争。我觉得TableView接收了水龙头但不知何故无法处理它 ViewController:

@interface SecondTabVC : UIViewController <UITableViewDelegate,UITableViewDataSource> 
{

    IBOutlet UISegmentedControl * sgmTopMenu; //has 3 segments

    NSArray * arrHrefLinks;
    NSArray * arrImgLinks;

    IBOutlet UIImageView * imgFiles;

    int selectedSegmentIndex;
    IBOutlet UITableView* tblLinks;

}

@property (retain,nonatomic) IBOutlet UISegmentedControl * sgmTopMenu;

@property (retain,nonatomic) IBOutlet UIImageView * imgFiles;

@property (retain,nonatomic) NSArray * arrHrefLinks;
@property (retain,nonatomic) NSArray * arrImgLinks;

@property (retain,nonatomic) IBOutlet UITableView* tblLinks;


-(IBAction)onTopMenuTap:(id)sender;

@end

实现:

    // called when UIsegment's Value changed, linked in IB
    -(IBAction)onTopMenuTap:(id)sender
    {

        selectedSegmentIndex = ((UISegmentedControl*)sender).selectedSegmentIndex;

        NSLog(@"onTopMenuTap: %i",selectedSegmentIndex);

        switch (selectedSegmentIndex) {
            case 0: 
            case 1: 
                tblLinks.hidden = NO;
                tblLinks.delegate = self;
                tblLinks.dataSource = self;
                tblLinks.userInteractionEnabled = YES;
                tblLinks.allowsSelection=YES;
                tblLinks.allowsSelectionDuringEditing = YES;
                [tblLinks reloadData];
                [tblLinks becomeFirstResponder];
                break;
            case 2: // settings
                tblLinks.hidden = YES;
    //          tblLinks.delegate = nil;
    //          tblLinks.dataSource = nil;
                break;
        }

    }

    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
        return 1;
    }

    // Customize the number of rows in the table view.
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        int numberOfRowsInSection=0;
        switch (selectedSegmentIndex) {
            case 0: 
                numberOfRowsInSection = arrHrefLinks.count;
                break;
            case 1: 
                numberOfRowsInSection = arrImgLinks.count;
                break;
        }
        return numberOfRowsInSection;
    }

// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    LinkCell *cell= (LinkCell*)[tableView dequeueReusableCellWithIdentifier:LINK_CELL_ID];

    if (cell == nil)
        cell = [[[NSBundle mainBundle]
                 loadNibNamed:LINK_CELL_ID
                 owner:self 
                 options:nil] lastObject];

    // Setting up the cell...
    HTMLNode * node = nil;
    NSString * header = nil;
    switch (selectedSegmentIndex) {
        case 0: 
            node = [arrHrefLinks objectAtIndex:[indexPath row]];
            header = [node getAttributeNamed:@"title"];
            if (!header || header.length==0)
                header = [node contents];
            if (!header || header.length==0)
                header = [node allContents];
            if (!header || header.length==0)
                [node getAttributeNamed:@"name"];
            cell.lblName.text = header;
            //cell.textLabel.text = header;
            cell.lblUrl.text = [node getAttributeNamed:@"href"];
            break;
        case 1: 
            node = [arrImgLinks objectAtIndex:[indexPath row]];
            header = [node getAttributeNamed:@"title"];
            if (!header || header.length==0)
                [node getAttributeNamed:@"name"];
            if (!header || header.length==0)
                header = [node contents];
            if (!header || header.length==0)
                header = [node allContents];
            cell.lblName.text = header;
            //cell.textLabel.text = [header copy];
            cell.lblName.text = [node getAttributeNamed:@"name"];
            //cell.lblUrl.text = [node getAttributeNamed:@"src"];

            break;
    }

    return cell;

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"didSelectRowAtIndexPath");
}

2 个答案:

答案 0 :(得分:2)

我找到了问题的来源。这是PSWebView。它被放置在第一个标签的视图中,但似乎它拦截了任何其他控制器中的所有水龙头。摆脱它解决了我的问题。 BTW PSWebView不使用手势,所以问题不在于手势。

答案 1 :(得分:0)

你必须编写代码来取消选择该行,否则它将保持被选中。我认为这是你的问题的原因。所以这样做

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