Open minjae-L opened 5 months ago
SearchResultViewController
의 viewDidLoad
가 실행되었다가 안되는 이유는
ViewController
의 configureNavigationBar()
메소드에서 UISearchController
의 searchResultController
로 SearchResultViewController
를 넣어주고 있는데 이미 뷰가 메모리에 있어서 그럴 수 있다고 생각이 드네.
정확한 이유는 잘 봐야겠지만 dismiss 할 때 메모리에서 해제되는지 확인해보는 것도 좋을 것 같아.
deinit { }
이 호출되는지 확인해보는 것도 방법일듯..?
해결방법: viewWillAppear에서 delegate 지정
원인분석
ViewController
의 NavigationItem
에서 UISearchController
를 초기화하였다.
UISearchController
는 SearchResultViewController
이고, ViewController
가 viewDidLoad
되었을 때, SearchResultViewController
도 메모리에 올라와 있는 상태이고 초기화가 되어있었다.
SearchResultViewController
에서 SearchBar
안 text에 따라 필터링된 결과를 보여주기 위해 delegate를 지정하는것이
SearchResultViewController
의 viewDidLoad
에서 실행되었고, 이는 ViewController
가 보여질때 실행되었다.
하지만 추가 버튼을 누르면서 'SearchResultViewController'를 dismiss 하여도 메모리에는 존재하기 때문에
delegate
를 선언하는 부분이 ViewController
로 돌아와도 재실행 되지 않아서 재검색이 불가능 하였다.
수정방향
SearchBar
안의 문자열에 따라 필터링된 결과를 보여주기 위해, MKLocalSearchCompleter
의 delegate
를 연결하고,
지역검색의 맞춰서 필터링된 데이터를 보여주기위해 TableView
의 delegate
연결하는 시점을 viewWillAppear
시점에 넣어주었다.
viewWillAppear
에서 delegate 관련된 걸 처리할 때 메모리 누수도 같이 확인하면 좋을 것 같아.
UISearchController는 3가지 형태가 있다.
아무것도 누르지 않은 형태
검색창을 클릭한 형태
검색창에 문구를 적은 형태
홈VC -
ViewController
검색결과VC -SearchResultViewController
자세한정보VC -WeatherViewController
검색창에 문구를 적어서 해당 문구에 맞춰 필터링된 결과를 선택한다. 선택하면 자세한 정보가 담긴 뷰를 present하게 되는데, 거기 뷰에서 추가 버튼을 클릭 시, 홈화면의 "아무것도 누르지 않은 형태" 로 돌아가려고 한다.
ViewController - SearchResultViewController - WeatherViewController
세개의 뷰컨이 쌓여있다.SearchResultViewController viewDidLoad
가 실행되었지만, dismiss 이후 재검색시 실행되지않는다.