2014-10-02 7 views
18

스토리 보드에 UITableViewController가 있습니다. 내 UITableViewCell 프로토 타입을 선택하면 세그웨이가 다른 컨트롤러를 표시합니다. 프레젠테이션 자체가 효과적입니다.UITableViewCell selection Storyboard segue is slow - 더블 탭핑이 작동합니다.

셀을 두드리는 것이 예상대로 셀을 강조 표시하지만 때로는 단절을 수행하기 전에 몇 초가 걸리는 이상한 버그 (iOS 8에서 도입되었을 수도 있음)를 발견했습니다. 셀을 두 번 누르면 바로 그 부분이 생깁니다.

다른 사람이 iOS 8에서이 사실을 알고 있습니까?

편집 : 이제는 세그를 더 빠르게 트리거하는 두 번 누르기가 아니라는 것을 알았습니다. 또한 셀 위를 탭하여 아무 데나 스 와이프합니다. 나에게 스레딩 문제 ... 내 경우

+1

스토리 보드에는 코드가 전혀 없습니다. 'didSelectRow'에'performSegue'를 추가하면 어떻게됩니까? 추신 : 나는 segues를 사용하는 것이 싫다. 내가 그들을 추가하는 유일한 이유는 응용 프로그램의 흐름을 표시하는 것이다. –

+0

네, 코드를 게시 하겠지만 기본적으로 아무 것도 없습니다. 네가 한 말을 똑같이 해봐. – Keller

+0

뭔가해야합니다. 새로운 프로젝트를 만들었을뿐 아니라 오래된 프로젝트를 테스트했지만, iOS8 이전처럼 선택과 푸시간에 지연이 없습니다. –

답변

23

처럼 보일하기 시작,이 솔루션은 GCD를 사용하는 대신에 스토리 보드에서 UITableViewCell 선택 콘센트를 사용하여 메인 큐에 didSelectRow에서 수동으로 performSegue를 호출 었죠. 이것은 확실히 당신은 스토리 보드의 선택 콘센트가 메인 큐에서 작동 것이라고 생각할 것 necessary- 된 이유

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 
    dispatch_async(dispatch_get_main_queue(), ^{ 
    [self performSegueWithIdentifier:kShowDetailSegue 
          sender:nil]; 
    }); 
} 

는 잘 모르겠어요,하지만 어쩌면 그것은 아이폰 OS 8 버그입니다.

+1

문제가 해결되었습니다. 감사합니다. @Keller –

+2

이 segue가 원래 segue와 같은 방식으로 작동하게하려면. 'sender : nil' 대신에'sender : [tableView cellForRowAtIndexPath : indexPath]'를 사용하십시오. 이는 segue 준비에서 대상보기 컨트롤러를 설정할 때 종종 필요한 것처럼 보낸 사람을 사용하여 indexPath를 결정할 수 있음을 의미합니다. – nacross

+0

performSegueWithIdentifier를 프로그래밍 방식으로 호출하는 경우 실제로 다음 뷰를로드하기 전에 말 그대로 10 초 이상 걸리는 비슷한 문제가 발생했습니다.배후에서 어떤 종류의 스레드 넌센스가 발생했는지 확신 할 수 없지만 메인 큐를 디스패치하면 내 문제도 해결됩니다. 가치가있는 부분에 대해서는 멀티 피어 연결을 많이 사용하고있었습니다. 그게 관련이 있는지 확실하지 않습니다. – GrandOpener

3

Carlos Vela이 맞으면 UITableViewCell 선택이 none이고 실제 장치에서만 버그가 발생합니다. 선택 후에 CFRunLoop을 깨우면이 문제가 해결되어이 "보편적 인"해결 방법 (UITableViewCell의 카테고리)으로 안내하게되었습니다.

업데이트 : iOS7에서 완벽하게 작동하지만 iOS8에서는 투명 UITableViewCell 배경을 파기합니다 (흰색).

#import <objc/runtime.h> 

@implementation UITableViewCell (WYDoubleTapFix) 

+ (void)load 
{ 
    Method original, swizzled; 

    original = class_getInstanceMethod([UITableViewCell class], @selector(setSelected:animated:)); 
    swizzled = class_getInstanceMethod([UITableViewCell class], @selector(mySetSelected:animated:)); 
    method_exchangeImplementations(original, swizzled); 
} 

- (void)mySetSelected:(BOOL)selected animated:(BOOL)animated 
{ 
    [self mySetSelected:selected animated:animated]; 
    CFRunLoopWakeUp(CFRunLoopGetCurrent()); 
} 

@end 
관련 문제