Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IOS Issue Getting Index Path Row at Specific Point

I have a view controller that contains a navigation bar, a table view and a tool bar. I included the UITableViewDelegate in the view controller, and correctly assigned the table's data source and delegate to the view controller through the storyboard. The table view loads its data from a remote database, once the table scrolls to the last cell more data is loaded into the table. I achieved this by using the scrollViewDidScroll and indexPathForRowAtPoint methods as outlined in the following post: How to know when UITableView did scroll to bottom in iPhone. However, when I run the app and scroll through the table the only index path returned by indexPathForRowAtPoint is the one that was located at the specified point at the time of table load. Here is the code and the output I get when I scroll:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint bottomPoint = CGPointMake(160, 430);
    CGPoint topPoint = CGPointMake(160, 10);

    NSLog(@"%d", [[_tableView indexPathForRowAtPoint:bottomPoint] row]);

}

Every time I scroll the following is outputted:

2013-06-08 00:56:45.006 Coffee[24493:907] 3
2013-06-08 00:56:45.012 Coffee[24493:907] 3
2013-06-08 00:56:45.040 Coffee[24493:907] 3
2013-06-08 00:56:45.069 Coffee[24493:907] 3
2013-06-08 00:56:45.088 Coffee[24493:907] 3
2013-06-08 00:56:45.105 Coffee[24493:907] 3
2013-06-08 00:56:45.135 Coffee[24493:907] 3
2013-06-08 00:56:45.144 Coffee[24493:907] 3
2013-06-08 00:56:45.173 Coffee[24493:907] 3
2013-06-08 00:56:45.180 Coffee[24493:907] 3

Where 3 is the indexPath.row of the cell the bottom point is on when the controller loads. What am I doing wrong and why is this happening? Does it have anything to do with the fact that the UITableView is located inside a parent view controller?

like image 430
ScottOBot Avatar asked Jun 08 '13 05:06

ScottOBot


People also ask

How do you get the indexPath row when a button in a cell is tapped?

add an 'indexPath` property to the custom table cell. initialize it in cellForRowAtIndexPath. move the tap handler from the view controller to the cell implementation. use the delegation pattern to notify the view controller about the tap event, passing the index path.

What is indexPath row in Swift?

A list of indexes that together represent the path to a specific location in a tree of nested arrays.

How do I create an indexPath in Swift?

Below are the methods of creating an Indexpath. To create an IndexPath in objective C we can use. NSIndexPath *myIP = [NSIndexPath indexPathForRow: 5 inSection: 2] ; To create an IndexPath in Swift we can use.


2 Answers

bottomPoint is looking for a location inside your scrollView. Your scrollView contains a table, and all the cells are in the SAME PLACE all the time, relative to your scrollView. That is why you always get the same cell at that point.

When you scroll, the cells don't move in the scrollView, the scrollView "moves" relative to its parent. This is done by having its contentOffset changed.

If you add your scrollView's y content offset to your bottomPoint, you'll get the point that you are probably really looking for in your scrollView.

like this:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    CGPoint bottomPoint = CGPointMake(160, 430) - scrollView.contentOffset.y;
    CGPoint topPoint = CGPointMake(160, 10);

    NSLog(@"%d", [[_tableView indexPathForRowAtPoint:bottomPoint] row]);

}
like image 140
HalR Avatar answered Nov 06 '22 05:11

HalR


As you can see from the Apple's Documentation, the Method indexPathForRowAtPoint: is refer to a point in the local coordinate system of the receiver (the table view's bounds), BUT NO the table view's frame. As the bottomPoint you set is in the table view's frame coordinate system, you will not get the right indexPath. HalR's answer gives the bottomPoint in the table view's bounds coordinate system.

indexPathForRowAtPoint:

Returns an index path identifying the row and section at the given point.

- (NSIndexPath *)indexPathForRowAtPoint:(CGPoint)point

Parameters
point: a point in the local coordinate system of the receiver (the table view's bounds).

Return Value
An index path representing the row and section associated with point or nil if the point is out of the bounds of any row.

FYI different between Frame and Bounds

like image 20
lu yuan Avatar answered Nov 06 '22 05:11

lu yuan