Reputation: 1173
I have a UITableView
, with multiple sections in it, and each section has multiple rows. I want to get the row number of selected cell with respect to the entire table and not the section only.
example:
UITableView
, section 1 has 3 rows and section 2 has 5 rows.didSelectRowAtIndexPath
method, rather than getting 2 as the row number (which is with respect to the section).I tried to get the row number myself by doing the following, but it does not seem to work:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *selectedCell = [tableView cellForRowAtIndexPath:indexPath];
NSLog(@"%d",indexPath.row);
int theRow = indexPath.row;
NSLog(@"%d",theRow);
}
I was thinking of storing the row number in an int
variable, and then add row numbers to it myself, but the code crashes when trying to store indexpath.row
in theRow
.
Please help. Thank you
Upvotes: 16
Views: 26605
Reputation: 6110
The following is a Swiftier version of @Wain solution:
let rowNumber = Array(0..<indexPath.section).reduce(0) { $0 + tableView.numberOfRows(inSection: $1) } + indexPath.row
Upvotes: 1
Reputation: 20710
Let say I implement the code below in didSelectRowAt
/ didSelectItemAt
callbacks ...
var index: Int = indexPath.row
for i in 0..<indexPath.section {
index += tableView.numberOfRows(inSection: i)
}
var index: Int = indexPath.item
for i in 0..<indexPath.section {
index += collectionView.numberOfItems(inSection: i)
}
Example: 2 sections, 3 rows(items) each. Selected row(item) 1 in the section 1,
index
= 4
Upvotes: 0
Reputation: 12596
I had a big data set and the previous answers using for loops was causing performance issues for me in the lower sections. I ended up doing the calculating beforehand and sped things up a bit.
private var sectionCounts = [Int:Int]()
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
let number = fetchedResultsController.sections?[section].numberOfObjects ?? 0
if section == 0 {
sectionCounts[section] = number
} else {
sectionCounts[section] = number + (sectionCounts[section-1] ?? 0)
}
return number
}
func totalRowIndex(forIndexPath indexPath: NSIndexPath) -> Int {
if indexPath.section == 0 {
return indexPath.row
} else {
return (sectionCounts[indexPath.section-1] ?? 0) + indexPath.row
}
}
Upvotes: 2
Reputation: 3287
Here's a cleaner implementation of this concept in Swift:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) ->
var rowNumber = indexPath.row
for i in 0..<indexPath.section {
rowNumber += self.tableView.numberOfRowsInSection(i)
}
// Do whatever here...
}
Upvotes: 10
Reputation: 613
Here is a Swift adaption of the above answer by Wain
class func returnPositionForThisIndexPath(indexPath:NSIndexPath, insideThisTable theTable:UITableView)->Int{
var i = 0
var rowCount = 0
while i < indexPath.section {
rowCount += theTable.numberOfRowsInSection(i)
i++
}
rowCount += indexPath.row
return rowCount
}
Upvotes: 9
Reputation: 1
i dont know about the multiple sections but i can give you for the one section...
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSInteger index=indexPath.row;
NSString *string=[[NSString alloc]initWithFormat:@"%ld",(long)index];
}
from this you can get the row number and you can save it to the string....
Upvotes: -4
Reputation: 119031
NSInteger rowNumber = 0;
for (NSInteger i = 0; i < indexPath.section; i++) {
rowNumber += [self tableView:tableView numberOfRowsInSection:i];
}
rowNumber += indexPath.row;
Upvotes: 44