Использовали ли didSelectRowAtIndexPath или метод prepareForSegue для UITableView?
Я использую раскадровки, и у меня есть UITableView. У меня есть настройка segue, которая перемещается из моего стола в подробный VC. Но какой метод я должен использовать, чтобы справиться с этим? Я должен передать пару объектов в подробный вид. Но я использую didSelectRowAtIndex
или же -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
?
6 ответов
Если вы используете prepareForSegue:sender:
тогда вам не нужно будет так много менять, если позже вы решите запустить переход из какого-то элемента управления вне представления таблицы.
prepareForSegue:sender:
сообщение отправляется текущему контроллеру представления, поэтому я бы предложил что-то вроде этого:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
// Assume self.view is the table view
NSIndexPath *path = [self.tableView indexPathForSelectedRow];
DetailObject *detail = [self detailForIndexPath:path];
[segue.destinationViewController setDetail:detail];
}
В Свифте:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
let path = self.tableView.indexPathForSelectedRow()!
segue.destinationViewController.detail = self.detailForIndexPath(path)
}
Я сделал это, и это сработало
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"Row Selected = %i",indexPath.row);
[self performSegueWithIdentifier:@"testID" sender:self.view];
}
Когда отправителем является UITableViewCell, вы можете попросить UITableView запросить indexPath ячейки.
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if let cell = sender as? UITableViewCell {
let indexPath = self.tableView.indexPathForCell(cell)!
assert(segue.destinationViewController.isKindOfClass(DetailViewController))
let detailViewController = segue.destinationViewController as! DetailViewController
detailViewController.item = self.items[indexPath.row] // like this
}
}
Если ячейка отправителя не выбирается, self.tableView.indexPathForSelectedRow
возвращает выбранную ячейку, но не ячейку перехода. Лучший способ получить indexPath для segue sender:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
((MyViewController *)[segue destinationViewController]).senderIndexPath = [self.tableView indexPathForCell:sender];
}
В Свифте:
override func prepareForSegue(segue: NSStoryboardSegue, sender: AnyObject?) {
(segue.destinationController as! MyViewController).senderIndexPath = self.tableView.indexPathForCell(sender)
}
Если ваше свойство tableView находится в другом классе, и у вас есть только один раздел, то вы можете использовать tag
свойство для хранения строки ячейки, как:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell"];
cell.tag = indexPath.row;
return cell;
}
И тогда вы можете получить к нему доступ как sender
та же самая ячейка со значением строки в ее теге:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
MyDestinationViewController *destinationViewController = segue.destinationViewController;
destinationViewController.myProperty = [tableViewElementsArray objectAtIndex:[sender tag]]; // sender will be your cell
}
Если вы используете prepareForSegue:
Вы можете проверить, кто является отправителем и выполнить другой код
Например в свифт
override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)
if senderIsTableviewCell
{
//do something
}
}