wagashi
wagashi

Reputation: 894

Objective-C UITableView index

How do I read always the most upper line (cell.textLabel.text) in a UITableView?

I have two slightly different approaches;

1:

UITableViewCell *cell2 = [tableView cellForRowAtIndexPath:indexPath];
NSString *cellText2 = cell2.textLabel.text;
NSLog (@" cellText2 = %@", cellText2);

2:

NSMutableString *newidea = [self.array objectAtIndex:indexPath.row];

NSLog (@"newidea = %@", newidea);

Both codes are inside the method - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath

self.array is same array that fills up the tableView.

The former approach always shows text from the sixth cell. The latter approach always shows text from the fifth cell. In my tableview there is four cells at a time.@

What I want to get is the text from the most upper cell.

Upvotes: 0

Views: 784

Answers (2)

Accatyyc
Accatyyc

Reputation: 5828

I think you have the wrong approach. You don't read values from cells, instead you let the cells read values from your data array. A cell can always have an arbitrary value since they are reused. Even if you have 30 "cells" in your table view there may only be 5 existing actual cells. When a cell goes outside the table view when you scroll, it is moved to the bottom and reused as the next cell. That's why you always have to set the values for each cell on the index path.

Instead you should get the value in the first cell from your data array if you have one. When the table view asks what title the cell att indexPath.row == 0 should have, you give it to it in cellForRowAtIndexPath, for example from an array called "_cellTitles" containing 30 strings for 30 different cells.

If you want to get the text from the "most upper" visible cell, then you can call indexPathsForVisibleRows on the table view. The first object in the returned array is the index path for the most upper visible cell. You can check the string in your array at index indexPath.row.

Example:

NSArray *visibleRows = [self.tableView indexPathsForVisibleRows];
NSIndexPath *firstVisibleCell = [visibleRows objectAtIndex:0];
NSString *firstVisibleCellTitle = [_myDataArray objectAtIndex:indexPath.row];

Upvotes: 4

Amol
Amol

Reputation: 1

If you always want to read from first row, instead of indexPath just say 1 there. That way it will always read from the first row.

Upvotes: 0

Related Questions