2015-01-15 3 views
2

tableView에 기본적으로 숨겨져있는 searchBar를 갖고 싶지만 사용자가 아래로 당길 경우 검색 바가 나타납니다.tableView searchBar를 숨기려면 어떻게해야합니까?

그래서 다음 코드를 사용하여 구현했지만보기가 처음 표시 될 때 searchBar가 일시적으로 표시되며이 간단한 플래시는 피하고 싶습니다. self.tableView.contentOffset = CGPointMake(0, 0) 메서드를 viewDidLoad() 메서드에 추가해도 아무런 영향이 없습니다. tableView는 네비게이션 컨트롤러 뒤에 있으므로 Y 오프셋을 0으로 설정하면 탐색 표시 줄 뒤에 searchBar가 효과적으로 숨겨집니다. view가 먼저 표시 될 때 tableView의 headerView가 숨겨 지는지 확인하는 방법에 대한 아이디어.

간단히 headerView를 제거하는 것으로 생각했지만 사용자는 아래로 드래그하여 액세스 할 수 없습니다.

override func viewDidLoad() { 
    super.viewDidLoad() 

    searchBar.delegate = self 
    searchBar.frame = CGRectMake(0, 0, self.tableView.frame.size.width, 44) 
    if let tv = self.tableView { 
     if let headerView = tv.tableHeaderView { 
      headerView.addSubview(searchBar) 
     } else { 
      FLOG("No table header view is available so create one!") 
      let headerView = UIView() 
      let width: CGFloat = tv.frame.size.width 
      headerView.frame = CGRectMake(0, 0, width, 44); 
      tv.tableHeaderView = headerView 
      tv.tableHeaderView!.addSubview(searchBar) 
     } 
    }   
} 
override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    dispatch_after(0, dispatch_get_main_queue()) { 
     self.tableView.contentOffset = CGPointMake(0, 0) 
    } 
} 

답변

0

나는 viewWillAppearviewDidLoad과 순서 문제가 있다고 생각. 알다시피, viewWillAppear은 뷰가 그려지고 뷰 계층 구조에 추가 될 때마다 호출되는 반면, VC가 서브 뷰를 처음로드 할 때 viewDidLoad가 호출됩니다.

그래서, 나는 이동하기 때문에 호출 (0,44)에 당신의 검색 창을 배치 한 후 viewWillAppear가 호출되는하지만 실제로는 간단한 시각적 글을 일으키는 viewDidLoad로 첫 번째 실행에 mainQueue를 통해보기 하중을 가정 테이블의 mainQueue 오프셋. 그러나 이후의 호출에서는 viewDidLoad이 이미 발생 했으므로 viewWillAppear 만 호출됩니다. 그리고 검색 창은 처음에는 (0,44)에서 시작하지 않았으므로 (0,0)로 이동해야하므로 블립이 없습니다.

검색 막대의 프레임을 직접 정의하는 대신 tableHeader에 추가 한 후 sizeToFit을 호출 해보십시오. 둘째, 머리글보기를 인스턴스화 할 필요가 없다고 생각합니다. 검색 막대와 동일하게 설정하면됩니다. 마지막으로 contentOffset 호출을 dispatch_queue 밖으로 가져 오면 viewWillAppear을 그대로 처리해야합니다.

최근에 iOS8 용 UISearchController에 깊이 들어가서 여행을 문서화했습니다 (적어도 부분적으로). 내가 사용한 코드는 here's a link to the implementation file이고 corresponding write-up을 사용했습니다. ObjC에 있기 때문에 약간의 번역이 필요합니다. 하지만 모양은 다음과 같습니다.

self.searchController = [[UISearchController alloc] initWithSearchResultsController:self.filteredResultsTableViewController]; 
self.searchBar = self.searchController.searchBar; 

// other code ... 

[self.searchBar sizeToFit]; 

// other code ... 

self.tableView.tableHeaderView = self.searchBar; 
+0

감사하지만 'viewWillAppear'에서 'contentOffset'을 호출하면 직접 작동하지 않습니다. 나는 그들이 '파견'을 사용하여 일하는 또 다른 게시물을 발견했습니다. 이것은 iOS8.x의 새로운 동작입니다. 곧 다른 제안을 살펴 보겠습니다. –

+0

당신은 'viewDidLoad'가 한 번 호출되면 뷰가 표시 될 때마다 'viewWillAppear'가 호출된다는 점에서 정확합니다. –

+0

또한 headerView에 다른 뷰를 추가하는 것을 잊어 버렸습니다. 그래서 searchBar 자체를 사용하지 않습니다. 그러나 이것은 디스플레이에 영향을주지 않습니다. –

관련 문제