ストーリーボードを使用していて、UITableViewがあります。テーブルから詳細VCにプッシュするセグエのセットアップがあります。しかし、これを処理するにはどの方法を使用すればよいですか?いくつかのオブジェクトを詳細ビューに渡す必要があります。しかし、didSelectRowAtIndex
または-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
を使用しますか?
prepareForSegue:sender:
thenを使用する場合、後でテーブルビュー外のコントロールからセグエをトリガーすることにした場合、それほど変更する必要はありません。
prepareForSegue:sender:
メッセージは現在のView Controllerに送信されるため、次のようなものを提案します。
- (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];
}
Swiftの場合:
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を取得することです。
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
__auto_type itemViewController = (id<ItemViewController>)segue.destinationViewController;
itemViewController.senderIndexPath = [self.tableView indexPathForCell:sender];
}
Swiftの場合:
protocol ItemViewController {
var senderIndexPath : IndexPath? { get set }
var selectedIndexPaths : [IndexPath]? { get set }
}
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if let cell = sender as? UITableViewCell,
var itemViewController = segue.destination as? ItemViewController {
itemViewController.senderIndexPath = tableView.indexPath(for: cell)
itemViewController.selectedIndexPaths = tableView.indexPathsForSelectedRows
}
}
tableViewプロパティが別のクラスにあり、セクションが1つだけの場合、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:
を使用すると、送信者を確認して別のコードを実行できます
たとえば、Swift
override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)
if senderIsTableviewCell
{
//do something
}
}