0

于是又是著名的话题。我不得不说我已经阅读了这里所有类似的主题,也用谷歌搜索了它。但没有任何帮助。
我的应用程序的结构如下: RootControlleris TabController,然后每个选项卡都有自己NavigationControllerViewController内部。在 ViewController 里面我放了一个UITableView. 全部在 IB 中设计。DataSourceDelegate正确连接。TableView使用自定义TableCell,但我也尝试过标准TableCell。还有一个UISegmentedControl更改DataSource数组
我检查并仔细检查的内容(简而言之,我在类似主题中找到的所有内容):

  • myViewController确实声明并实现了UITableViewDelegateUITableViewDataSource(或无法在 IB 中连接相应的属性)
  • DataSourceDelegate属性在 IB 中正确连接。此外,它在代码中由setDelegate:self和重复setDataSource:self
  • 我的自定义TableCell已启用用户交互
  • 我的自定义TableCell包含 2 个标签和一个图像,都没有启用用户交互标记
  • 它调用[tableView reloadData]
  • 试着[tableView becomeFirstResponder]
  • TableView 具有像单个单元格选择、允许用户交互、允许在编辑时选择单元格等选项。
  • 没有didSelectRowAtIndexPath像 DEselect 之类的错字。此外,TableView的委托方法是从工作应用程序中复制粘贴的,并更改了方法内部的代码。我的意思是方法的名称/声明中不能有任何拼写错误。
  • didSelectRowAtIndexPath方法只包含一个代码行,它是NSLog(@"didSelectRowAtIndexPath");
  • XCode重启了好几次
  • 做了clean all targets
  • 不在ARC项目中使用
  • 显示表格时没有繁重的操作或任何其他操作正在运行

TableView本身在填充数据和显示数据的意义上工作得很好。但是,如果我点击单元格,它会以蓝色突出显示,看起来它会冻结选择。从它突出显示一个单元格的那一刻起,任何其他单元格都无法突出显示,并且突出显示的单元格不能被取消选择。未调用 didSelectRowAtIndexPath。但是,如果尝试通过拖动表格多次点击单元格,则有时该方法会调用。就像在极少数情况下被调用并且表中的记录不超过 3 条一样。这是一个非常奇怪的问题,我无法抗拒。我觉得 TableView 收到了水龙头,但不知何故无法处理它。
视图控制器:

@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");
}
4

2 回答 2

2

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

于 2013-06-13T11:03:41.507 回答
0

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

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
于 2013-06-13T10:11:07.073 回答