尝试调用`didSelectRowAtIndexPath`但第一次没有调用

时间:2016-12-14 04:47:35

标签: ios uitableview

我有一个非常奇怪的问题,那就是我第一次调用didSelectRowAtIndexPath方法然后它不起作用。

如果我再次打电话,它就会完成。当我第一次设置断点时,didSelectRowAtIndexPath中的代码也将执行,但不会推送到下一个控制器。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    tableView.allowsSelection = NO;
    ChatRoom *room = [_rooms objectAtIndex:indexPath.row];
    if (!room.conv) {
        room.conv = [[_im imClient] conversationForId:room.convid];
    }
    CDChatRoomViewController* chatRoomVC=[[CDChatRoomViewController alloc] init];
    chatRoomVC.room = room;
    chatRoomVC.convId = room.convid;
    chatRoomVC.converSation = room.conv;
    chatRoomVC.hidesBottomBarWhenPushed = YES;
    [self.navigationController pushViewController:chatRoomVC animated:YES];
}

2 个答案:

答案 0 :(得分:0)

建议您检查一下您的方法,有两种看起来非常相同的方法

//当您的单元格被选中时,将调用此Below方法

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
//Cell selected
}

//取消选择单元格时,将调用此Below方法。这可能是你的情况

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
//Cell deselected

}

当您在tableview中选择一个单元格时,tableview将取消选择单元格的取消选择方法(多个选择除外)

希望这可以证明你的问题的答案是合理的。

答案 1 :(得分:0)

首先,您需要学习如何使用segue在视图控制器之间传输数据。在View Controller之间传输数据是一种非常快速和好的方法。还有其他方式像Delegate。

在您当前的视图控制器中,请声明

var selectedCD : Int = 0

按照didSelectRowAtIndexPath方法,请修正这些。

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    yourTableName.deselectRowAtIndexPath(indexPath, animated: true)
    // There is no need to do "tableView.allowsSelection = NO;"
    selectedCD = indexPath.row
    self.performSegueWithIdentifier("goToChatRoom", sender: self)
    // "goToChatRoom" is the name of segue which will go to CDChatRoomViewController which you need to set this at Storyboard.

}

ViewWillAppear() CDChatRoomViewController

self.hidesBottomBarWhenPushed = true

然后在您执行UITableView Delegate方法

的位置创建以下segue方法
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){
    if segue.identifier == "goToChatRoom"{
        let destinationController = segue.destinationViewController as! CDChatRoomViewController
        // handle selectedCD logic here
        ChatRoom *room = [_rooms objectAtIndex:indexPath.row];
        if (!room.conv) {
            room.conv = [[_im imClient] conversationForId:room.convid];
        } 
        destinationController.room = room;
        destinationController.convId = room.convid;
        destinationController.converSation = room.conv;
    }
 }

请在我的回答中编辑一些Objective-C代码,因为我真的不知道你在做什么。

您可以在这里学习使用segues:

Sending data with Segue with Swift

试试这种方式

  

请记住,不要在didSelectRowAtIndexPath 上添加[需要进行使用CPU或RAM的处理]的实现。