UITableView에 didSelectRowAtIndexPath 또는 prepareForSegue 메소드를 사용 하시겠습니까?


101

스토리 보드를 사용하고 있으며 UITableView가 있습니다. 내 테이블에서 세부 VC로 푸시하는 segue 설정이 있습니다. 그러나 이것을 처리하기 위해 어떤 방법을 사용해야합니까? 디테일 뷰에 몇 개의 개체를 전달해야합니다. 하지만 didSelectRowAtIndex또는 사용 -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender합니까?

답변:


199

사용 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)
}

1
좋아, indexPath를 기반으로 객체를 전달하여 구현하는 방법에 대한 예제를 제공 할 수 있습니까?
Jon

4
self.view단지가 될 수 sender여기? 나는 일도 할 수 없었고 [self.view indexPathForSelectedRow],해야 했어요[sender indexPathForSelectedRow];
ladookie dec.

Swift에서 어떻게할까요?
사용자

@robmayoff Swift 용으로 업데이트 해 주셔서 감사합니다. 최근 언어 변경 사항을 반영하기 위해 약간의 수정을했습니다. 이것이 다른 사람들에게 도움이
Zack Shapiro

그 이상한 tableView.indexPathForSelectedRow()올바른 값이 포함되어 prepareFroSegue...:라고 tableView(_:didSelectrowAtIndexPath:)나중에까지라고되어 있지 않습니다.
니콜라스 미아리

5

나는 이것을했고 그것은 효과가 있었다

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{

    NSLog(@"Row Selected = %i",indexPath.row);

    [self performSegueWithIdentifier:@"testID" sender:self.view];    
}

11
말이 안 돼. segue 또는 테이블 뷰 델리게이트를 사용해야합니다. Cell에서 segue를 생성하면 코드를 작성하지 않고도 동일한 작업을 자동으로 수행합니다.
Yariv Nissim 2013 년

3
didSelectRow없이 셀에 segue를 어떻게 할당합니까?
Morkrom 2013

3

보낸 사람이 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
        }
    }

1

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 
}

1

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
    }
}

0

사용 prepareForSegue:하면 발신자를 확인하고 다른 코드를 실행할 수 있습니다.

예를 들어 신속하게

override func prepareForSegue(segue: UiStoryboardSegue, sender: AnyObject?)
{
   var senderIsTableviewCell:Bool! = sender?.isKindOfClass(UITableViewCell)

   if senderIsTableviewCell
   {
       //do something
   }
}

2
그냥하세요 : tableViewCell = sender as? UITableViewCell {// 무언가를하십시오} . 보낸 사람을 UITableViewCell로 캐스팅 할 수없는 경우 "무엇이든 실행"이 실행되지 않습니다.
mbeaty
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.