如何判断UITableView是否包含特定的NSIndexPath?

时间:2012-05-08 20:52:47

标签: iphone objective-c ios xcode cocoa-touch

以下是我正在使用的代码:

if (appDelegate.currentMainIndexPath != nil /* && doesPathExistInTableView */)
{
    [tblView scrollToRowAtIndexPath:appDelegate.currentMainIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    appDelegate.currentMainIndexPath = nil;
}

8 个答案:

答案 0 :(得分:31)

你可以用它。传递indexpath的行和部分

目标C:

-(BOOL) isRowPresentInTableView:(int)row withSection:(int)section
{
    if(section < [self.tableView numberOfSections])
    {
        if(row < [self.tableView numberOfRowsInSection:section])
        {
            return YES;
        }
    }
    return NO;
}

斯威夫特3:

func isRowPresentInTableView(indexPath: IndexPath) -> Bool{
    if indexPath.section < tableView.numberOfSections{
        if indexPath.row < tableView.numberOfRows(inSection: indexPath.section){
            return true
        }
    }

    return false
}

答案 1 :(得分:21)

对卡姆兰汗的答案迅速改编:

extension UITableView {
  func hasRowAtIndexPath(indexPath: NSIndexPath) -> Bool {
    return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRowsInSection(indexPath.section)
  }
}

Swift 4:

extension UITableView {
    func hasRow(at indexPath: IndexPath) -> Bool {
        return indexPath.section < self.numberOfSections && indexPath.row < self.numberOfRows(inSection: indexPath.section)
    }
}

答案 2 :(得分:3)

有一种更方便的方法来判断indexPath是否有效:

对于Swift 3.0:

open func rectForRow(at indexPath: IndexPath) -> CGRect

对于Objective-C

- (CGRect)rectForRowAtIndexPath:(NSIndexPath *)indexPath;

如果indexPath无效,您将获得CGRectZero。

func isIndexPathValid(indexPath: IndexPath) -> Bool {
    return !tableView.rectForRow(at: indexPath).equalTo(CGRect.zero)
}

答案 3 :(得分:2)

如果你的意思是'在索引n处有一个单元格'那么你只需要将数据源的大小与n进行比较

if (appDelegate.currentMainIndexPath != nil [datasource count] > n)
{
    [tblView scrollToRowAtIndexPath:appDelegate.currentMainIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    appDelegate.currentMainIndexPath = nil;
}

其中datasource例如是NSArray。

答案 4 :(得分:1)

您就是这样做的:

indexPath.row < [self.tableView numberOfRowsInSection:indexPath.section]

在上下文中:

if (indexPath.row < [self.tableView numberOfRowsInSection:indexPath.section]) {
    [self.tableView scrollToRowAtIndexPath:indexPath
                          atScrollPosition:UITableViewScrollPositionTop
                                  animated:YES];
}

插入您的代码:

if (appDelegate.currentMainIndexPath != nil &&
    indexPath.row < [tblView numberOfRowsInSection:indexPath.section]) {
    [tblView scrollToRowAtIndexPath:appDelegate.currentMainIndexPath
                   atScrollPosition:UITableViewScrollPositionTop
                           animated:NO];
    appDelegate.currentMainIndexPath = nil;
}

答案 5 :(得分:0)

您也可以使用UITableView的numberOfRowsInSection方法。

答案 6 :(得分:0)

我在Kamran's answer上进行了迭代:

+ (BOOL)isIndexPath:(NSIndexPath *)indexPath inTableView:(UITableView *)tableView {
    if (!indexPath) {
        return NO;
    }
    if (indexPath.section < [tableView numberOfSections]) {
        if (indexPath.row < [tableView numberOfRowsInSection:indexPath.section]) {
            return YES;
        }
    }
    return NO;
}

答案 7 :(得分:-6)

您可以尝试通过以下方式获取UITableViewCell

- (UITableViewCell *)cellForRowAtIndexPath:(NSIndexPath *)indexPath;
// returns nil if cell is not visible or index path is out of range

这是完整的代码:

UITableViewCell *cell = [cellForRowAtIndexPath:appDelegate.currentMainIndexPath];

if (appDelegate.currentMainIndexPath != nil && cell !=nil)
{
    [tblView scrollToRowAtIndexPath:appDelegate.currentMainIndexPath atScrollPosition:UITableViewScrollPositionTop animated:NO];
    appDelegate.currentMainIndexPath = nil;
}