2012년 11월 12일 월요일

UINavigationController의 Back Button 이름 바꾸기

How to change NavigationBar Back Button's title

UINavigationController에서 Back Button의 기본 구현은 이전 ViewController의 Title을 이름으로 쓴다. 만들다 보면 이 이름을 바꾸는 경우가 생기는데 이게 좀 거시기하다.
알면 쉬운데 모르면 삽질하기 쉽다.(나도 방금 삽질 좀 했다)
딱 직관적으로 생각해보면
self.navigationItem.backBarButtonItem.title = "Back";
이런거 viewWillAppear 이런데다가 넣어주면 당연히 바뀔 것 같지 않은가?
self.navigationController.navigationItem.backBarButtonItem.title = "Back";
아니면 이런곳?
하지만 아쉽게도 이미 만들어진 Navigation Bar의 Back Button 이름을 바꿀 순 없는 것 같다.(내가 방금 찾아본 바로는.. 있으면 좀 알려주라)
저 navigationItem 이라는 property는 pushViewController 할 때 다음 장면에서 표시할 NavigationBar를 구성하면서 사용하는 것으로 보인다.
즉 push 하기 전에 미리 세팅되어 있어야 한다는 뜻이다.
게다가 심지어 push 되는 ViewController가 아닌 push 하는 ViewController 쪽에다가 설정해야 push 되는 ViewController가 나오는 장면에서 설정한게 보인다.
즉,
parentViewController.navigationItem.backBarButtonItem ...
[navigationController pushViewController:childViewController ...];
이런 식으로 해야 childViewController에서 원했던 Back Button을 볼 수 있단 말이다.

정리하면 이렇다.

FirstNavigationController, SecondNavigationController가 있고 각각의 title이 "First", "Second"라고 하자.
SecondNavigationController에서 Back Button의 title을 "First"가 아닌 "Back"으로 표시되게 하고 싶다.
그러면 First에서 Second를 push하는 부분을 아래와 같이 구현하면 된다.

- (void)onClickSecondButton
{
    self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc] initWith...];
    SecondViewController *second = ...;
    [self.navigationController pushViewController:second animated:YES];
}

넘어갈 때 매번 Button을 생성하란 소리가 아닌 것 쯤은 알거라고 생각한다. 상황에 따라 알아서 하면 된다.
핵심은 push 하기 전에 미리 설정해야 한다는 것이다.

구현하는 입장을 생각해보면 이해가 되는 방식이지만 API인데 너무 오해하기 쉽게 만들어놨다는 점에서 만든분 나빠.

댓글 없음:

댓글 쓰기