I am trying to call didSelectRowAtIndexPath programmatically but am having trouble.
[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];
Gives me the following error:
Use of undeclared identifier 'indexPath'; did you mean 'NSIndexPath'?
Can anybody help me out? Thanks!
EDIT: From the responses below it sounds like im going about this the wrong way. How can I get the text of the selected items when a button is pressed (can be multiple selections)? I need to do this in a function dedicated to the button press.
You need to pass a valid argument, if you haven't declared indexPath
in the calling scope then you'll get that error. Try:
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:ROW_YOU_WANT_TO_SELECT inSection:SECTION_YOU_WANT_TO_SELECT]
[self tableView:playListTbl didSelectRowAtIndexPath:indexPath];
Where ROW_YOU_WANT...
are to be replaced with the row and section you wish to select.
However, you really shouldn't ever call this directly. Extract the work being done inside tableView:didSelectRowAtIndexPath:
into separate methods and call those directly.
To address the updated question, you need to use the indexPathsForSelectedRows
method on UITableView
. Imagine you were populating the table cell text from an array of arrays of strings, something like this:
- (UITableViewCell *)tableView:(UITableView *)tv cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tv dequeue...];
NSArray *rowsForSection = self.sectionsArray[indexPath.section];
NSString *textForRow = rowsForSection[indexPath.row];
cell.textLabel.text = textForRow;
return cell;
}
Then, to get all the selected text, you'd want to do something like:
NSArray *selectedIndexPaths = [self.tableView indexPathsForSelectedRows];
NSMutableArray *selectedTexts = [NSMutableArray array];
for (NSIndexPath *indexPath in selectedIndexPaths) {
NSArray *section = self.sectionsArray[indexPath.section];
NSString *text = section[indexPath.row];
[selectedTexts addObject:text];
}
selectedTexts
would at that point contain all selected information. Hopefully that example makes sense.
Swift Solution
Manually call didSelectRowAtIndexPath
let indexPath = IndexPath(row: 7, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .top)
tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath)
Just to update @Sourabh's answer, note that you can also provide a scrollPosition
when calling selectRow
:
let indexPath = IndexPath(row: 7, section: 0)
tblView.selectRow(at: indexPath, animated: true)
tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath)
Becomes:
let indexPath = IndexPath(row: 7, section: 0)
tblView.selectRow(at: indexPath, animated: true, scrollPosition: .top) // <--
tblView.delegate?.tableView!(tblView, didSelectRowAt: indexPath)
The possible constants are:
.none
The table view scrolls the row of interest to be fully visible with a minimum of movement. If the row is already fully visible, no scrolling occurs. For example, if the row is above the visible area, the behavior is identical to that specified by top. This is the default.
.top
The table view scrolls the row of interest to the top of the visible table view.
.middle
The table view scrolls the row of interest to the middle of the visible table view.
.bottom
The table view scrolls the row of interest to the bottom of the visible table view.
You need to define an indexPath variable if you don't already have one to stick in there.
Something like:
NSIndexPath * indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With