2017-02-15 6 views
0

아래 코드는 테이블 뷰에서 행을 사용자가 터치 할 때 프로그래밍 방식으로 뷰 컨트롤러를 표시합니다. 코드는 'didSelectRowtIndex'경로에 상주하며 테이블 뷰는 ViewController 클래스에 상주하며 테이블 뷰 델리게이트를 구현했습니다. 내가 겪고있는 문제는 현재 표시하려고하는 뷰 컨트롤러가 테이블 뷰 행의 두 번째 터치에만 나타납니다. 그러나 부모 뷰 컨트롤러가 처음으로로드되면 첫 번째 터치에 나타납니다. 아래는 아이 뷰 컨트롤러의 두 프레 젠 테이션을위한 'didSelectRowAtIndexPath'의 코드는 다음과 같습니다ViewController Presentation Swift 3

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 

    if indexPath.row == 0 { 

     let stockTable = StockTableVC() 
     self.present(stockTable, animated: false, completion: nil) 
    } 

    else indexPath.row == 1 { 

     let accountTable = AccountTableVC() 
     self.present(accountTable, animated: false, completion: nil) 
    } 

    ... 

모두 위의 행 선택시마다 호출되고되지만,에 somtimes 제시되지 않은 현재 뷰 컨트롤러 방법 첫 번째 선택 (또는 적어도 표시되지 않음). 이 수수께끼를 가진 어떤 도움든지 중대 할.

- 고마워요.

답변

0

은 (here를 문서화) 내 delay 기능을 사용합니다.

+0

흥미 롭습니다. 고맙습니다. 위의 행 선택 해제 솔루션은 잘 작동하지만 문제가있는 경우 후자를 사용해 보겠습니다. – jdeckman

+0

지연 시간이 0.1 초 이상 걸리면 어떻게 될까요? 앱이 다운됩니다. 이 행을 선택 해제하는 것보다 왜 이것을 사용하는 것이 가장 좋습니다. –

+1

@JuanCurti 타이밍에 관한 것이 아닙니다. 그것은 스레딩에 관한 것입니다. 따라서, 더 짧은 지연도 신뢰성있게 작동 할 것이다. 여기에서 사용하는 기술은 주 스레드를 종료하고 runloop을 완료하고 다음 runloop의 주 스레드로 되돌아 오는 것입니다. 우리는 우리가'didSelect'에있는 메소드가 완료 될 것이고 호출 스택 전체가 끝날 것이라고 확신하고 있습니다. 왜냐하면 그때까지 우리는 메인 스레드로 돌아갈 수 없기 때문입니다. 그리고 그 시점에서, 그리고 그 시점에 _only_, 우리는 프리젠 테이션을 시작하는 것이 안전합니다. – matt

1

먼저 행을 선택 해제해야합니다. 발표하기 전에 다음을 추가하십시오.

tableView.deselectRow(at: indexPath, animated: false) 

사실 나에게도 마찬가지입니다. 그러나 이것은 내가 전에 일하게하는 데 도움이되었습니다. 나는 그것이 당신을 위해서도 효과가 있기를 바랍니다.

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    if indexPath.row == 0 { 
     let stockTable = StockTableVC() 
     delay(0.1) { 
      self.present(stockTable, animated: false, completion: nil) 
     } 
    } 
    // ... and so on ... 
} 

이 프레젠테이션을 시작하기 전에 완료 선정 과정의 시간을 제공 :

+0

와우, 작동합니다. 고마워요! 이전 버전의 Swift에서는이 문제가 있다고 생각하지 않지만 잘못된 것일 수 있습니다. – jdeckman

+0

이것이 Swift 3의 어떤 것인지 확실하지 않지만, 그것은 나에게 많은 시간이 걸렸습니다. 모든 사람이이 문제를 해결할 수 있도록 올바른 것으로 표시하십시오. –

+0

감사합니다. 나는 올바른 것으로 표시하는 방법을 StackOverflow해야했습니다. 그것은 아주 명백하지 않습니다. – jdeckman

관련 문제