2011-02-24 3 views
1

을 채워되지 않습니다 나는 다음과 같은 코드를 가지고 : 나는 도구 모음을 표시하는보기를로드하지만, 경우도구 모음은 내보기 컨트롤러의 내에는 loadView의 methoad에서

// Populate self.view and add some views/UI elements 

// load Gender selection Bar 
self.navigationController.toolbarHidden = NO; 
self.navigationController.toolbar.tintColor = [UIColor colorWithRed:0 green:0.37 blue:0.5 alpha:1]; 

self.genderControl = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:NSLocalizedString(@"Male", nil), NSLocalizedString(@"Female", nil), nil]]; 
genderControl.segmentedControlStyle = UISegmentedControlStyleBar; 
genderControl.frame = CGRectMake(0, 0, 200, 30); 
genderControl.tintColor = [UIColor colorWithRed:0 green:0.37 blue:0.5 alpha:1]; 
[genderControl addTarget:self action:@selector(changeGender:) forControlEvents:UIControlEventValueChanged]; 
genderControl.selectedSegmentIndex = GENDER_MALE; 

UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithCustomView:genderControl]; 
UIBarButtonItem *flexSpace = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]; 

[[[self navigationController] toolbar] setItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES]; 
[item release]; 

은 그러나, 세그먼트 컨트롤이 표시되지 않습니다를. viewWillAppear : 내 코드를 움직이면 작동하지만 한 번 내보기를 숨기고 다시 다시 표시하면 분할 된 컨트롤이 다시 사라집니다.

아무도이 문제를 알고 있거나 해결 방법을 알고 있습니까? 아주 이상하게 보입니다.

+0

하나의 작은 급히 : 'self.genderControl = [[UISegmentedControl alloc] initWithItems : [NSArray arrayWithObjects : NSLocal] 행에 메모리 누수가있을 수 있습니다. genderControl 속성이 copy 또는 retain으로 설정되어있는 경우 autorelease를 모두 끝에 추가하려는 경우 izedString (@ "Male", nil), NSLocalizedString (@ "Female", nil) 그렇지 않으면 보유 수를 단 하나가 아닌 2만큼 증가시킵니다. –

+0

genderControl에는 보유 속성이 있지만 dealloc 메소드에서 해제되었습니다. 따라서 보유 수는 다시 양호합니다. 그래도 고마워! – Robin

+0

하지만 Simon 라인은 genderControl (self = 1은 1, alloc은 1)에 대해 2의 보유 수를 갖는 엔드 업을 가리키고 있습니다. dealloc은 0이 아닌 1로 줄입니다. 따라서 메모리 누수가 발생합니다! 사이먼은 내가 알 수있는 한 정확하다. – occulus

답변

2

대부분의 코드는 나에게 잘 보이고 viewDidLoad 또는 loadView 메서드에서 호출하면 모든 것이 작동합니다.

그러나 NavigationController에서 포함 된 도구 모음을 사용하면 툴바 항목이 도구 모음 자체가 아닌 ViewController에 설정됩니다. 여기

[self setToolbarItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES]; 

문서 :이와

[[[self navigationController] toolbar] setItems:[NSArray arrayWithObjects:flexSpace, item, flexSpace, nil] animated:YES]; 

: 그래서이 줄을 교체 http://developer.apple.com/library/ios/documentation/uikit/reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/setToolbarItems:animated을 :

을 당신은이 라인을 추가 할 것입니다 :

[flexSpace release]; 
+0

flexSpace 릴리스, 감사를 잊어 버렸습니다! 왜 도구 모음에 sizeToFit을 요청하고 싶습니까? 나는 그것이 전체 화면에 걸쳐 있기를 원한다. 또한 viewController를 프로그래밍 방식으로 생성하는 경우 loadView가 아닌 ​​viewDidLoad에 코드를 배치해야하는 이유가 무엇입니까? 나는 viewDidLoad에 코드를 넣으려고했지만 어느 쪽도 작동하지 않았다. – Robin

+0

@Robin 죄송합니다. NavigationController.toolbar를 사용하고 있음을 확인하기 위해 신중하게 질문을 읽지 않았습니다. 이 문제를 해결하기 위해 내 대답을 업데이트했습니다. 이것을 사용하면 sizeToFit을 사용할 필요가 없습니다. viewDidLoad와 loadView를 사용하는 경우에는 차이가 없어야합니다. – theChrisKent

+0

이제 ViewController 툴바 항목 속성에 대해 알지 못했습니다. 사실은 정말 똑똑한 시스템입니다. 감사합니다! – Robin

0

이 코드가 loadView에 있어야합니까? UIViewController docs을 확인하십시오 : loadView는 뷰 컨트롤러의 뷰를 완전히 프로그래밍 방식으로 생성하는 데 사용됩니다. loadView를 구현하면 아무것도 표시되지 않습니다. 이 코드는 대신 viewDidLoad에 있어야합니까? 나는 당신도 작성 및에는 loadView 방법의 주요 UIView의 지정하지 않는 것을 볼 - 당신이 일반적으로 볼 것으로 예상 것, 예를 :

self.view = [[[UIView alloc] init] autorelease]; 

당신은 는 같은에는 loadView를 구현하는 의미 않은 경우 가지고 있지 않다면 메인 뷰를 메소드의 상단으로 할당하기 위해 위 라인을 추가해야합니다.

Btw, 아마도 [toolbar setItems]를 animated = YES로 호출하면 안됩니다. 별로 중요하지 않으며 애니메이션 매개 변수의 정확한 값으로 인해 과거에는 알 수 없게 상황이 바뀌 었습니다.

+0

인터페이스 빌더 (지금까지)의 큰 팬이 아니기 때문에 뷰가 프로그래밍 방식으로 생성되었습니다. 아무것도 펜촉에서로드되지 않습니다. 코드가 게시되기 전에보기가 몇 줄로 설정되어 있어야합니다. – Robin

+0

아 좋아! 혼란을 피하기 때문에 앞으로는 전체 방법을 게시하는 것이 좋습니다. – occulus

+0

사실, 원래 게시물을 편집하고 viewLoad의 전체 코드를 넣으라고 제안 할 수 있습니까?다른 사람들은 내가했던 것과 같은 비 문제에 넘어갈 수 있으며 문제에 답하는 사람에게 도움이 될 수 있습니다. – occulus