스토리 보드를 사용하고 있으며 UITableView가 있습니다. 내 테이블에서 세부 VC로 푸시하는 segue 설정이 있습니다. 그러나 이것을 처리하기 위해 어떤 방법을 사용해야합니까? 디테일 뷰에 몇 개의 개체를 전달해야합니다. 하지만 didSelectRowAtIndex
또는 사용 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
합니까?
답변
사용 prepareForSegue:sender:
하면 나중에 테이블 뷰 외부의 일부 컨트롤에서 segue를 트리거하기로 결정하면 변경할 내용이 많지 않습니다.
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];
}
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
}
}
답변
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
}
답변
self.tableView.indexPathForSelectedRow
선택한 셀을 반환하지만 세그 발신자 셀은 반환하지 않습니다. 예를 들어 발신자 셀이 선택되지 않았거나 (액세서리 작업) 다중 선택의 경우. 가장 좋은 방법은 segue 보낸 사람에 대한 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
}
}
답변
사용 prepareForSegue:
하면 발신자를 확인하고 다른 코드를 실행할 수 있습니다.
예를 들어 신속하게
override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)
if senderIsTableviewCell
{
//do something
}
}