2012-05-12 2 views
1

내 기본 View Controller의 내 viewDidLoad 메서드에서 프로그래밍 방식으로 분할 컨트롤을 만든 다음 내 탐색 컨트롤의 titleView에 추가합니다. 내가, 내가 할 수없는 등의 viewWillAppear 같은 다른 방법에서이 세그먼트 컨트롤을 액세스 할 때 viewDidLoad에서 프로그래밍 방식으로 컨트롤을 추가하면 어떻게 다른 메서드에서 컨트롤에 액세스합니까?

NSArray *seggieItems = [[NSArray alloc] initWithObjects:@"See Entire List",@"See Near Me", nil]; 
UISegmentedControl *seggie = [[UISegmentedControl alloc]initWithItems:seggieItems]; 
[seggie setSegmentedControlStyle:UISegmentedControlStyleBar]; 
[seggie setTintColor:[UIColor redColor]]; 
[seggie addTarget:self 
      action:@selector(seggieChanged:) 
forControlEvents:UIControlEventValueChanged]; 


self.navigationItem.titleView = seggie; 

는하지만 - 그것은 선언되지 않은 식별자입니다. 내가 XIB를 사용하는 경우 내가 어디서든 사용할 수 있습니다 함께 IBOutlet이 것 때문에

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:animated]; 
    [seggie setSelectedSegmentIndex:0]; //this should always be 0 for this view controller viewDidLoad method 

} 

이 아무 문제 없을 것이다. Segmented 컨트롤에 대한 속성을 만들려고했으나 인스턴스 변수가 로컬 변수를 숨 겼기 때문에 잘못된 방식이어야합니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이것이 어리석은 질문이라면 사과드립니다. iOS에 상당히 익숙합니다. 현재 두 권의 책을 중도에두고 있습니다. Google 또는 StackOverflow 검색에서 답변을 찾을 수 없습니다. 어떤 도움을 주시면 고맙겠습니다. 그리고 이것이 정말 실종 된 것이라면 미안합니다. 감사합니다

+0

'범위'에 대한 인터넷 검색을 시도하십시오. 이것은 기본적으로 변수의 수명입니다. – 11684

답변

3

속성 만들기가 올바른 방법입니다. 그렇게하고 마스크 설명을 얻으면 아마 viewDidLoad 메서드에서 seggie 변수를 선언 할 것입니다. 해당 선언을 제거하고 항상 seggie 대신 self.seggie을 참조하면 문제가 없습니다. 당신은 당신의 헤더 파일에

UISegmentedControll *seggie 

의 속성을 하나 해, 또는 만들

UISegmentedControl *seggie = [[UISegmentedControl alloc]initWithItems:seggieItems];  

그것은

self.seggie = [[UISegmentedControl alloc]initWithItems:seggieItems]; 
+0

완벽하게 고쳐 주셔서 고마워요. 나는 seggie를 재산으로 만들었고, 그 다음 나의 선언을 바꾸었다. 그리고 그것은 매력처럼 작동한다. 이런 일들에 대해 다시 한 번 머리를 감싸기 시작했습니다. 다시 한 번 감사드립니다. – scotts7777

2

UISegmentedControl *seggie; 코드 줄을 .h (헤더) 파일에 넣거나 전역으로 설정하십시오!

다른 방법으로 로컬 생성 개체를 사용할 수 없습니다. Local and Instant Variable. 자바 용이지만 기본 아이디어를 이해하시기 바랍니다.

+0

감사합니다. 지금 잘못하고있는 것을 이해합니다. 로컬로 생성 된 세그먼트 화 된 컨트롤을 속성으로 전환 했으므로 이제는 어떤 방법 으로든 액세스 할 수 있습니다. 도움을 주셔서 감사합니다 – scotts7777

1

해야합니다 : 선언으로

나는이 줄을 의미 배열 전역. 그것이 당신에 대한 옵션이 없다면

, 나는

UISegmentedControl * temp = self.navigationController.titleView; 
[temp setSelectedSegmentIndex:0]; 
2

위 제안 옵션이 좋은 사용하여 접근 시도 중 하나를 속성이나 클래스 폭/전역 변수를 만들 것입니다. 또 하나의 방법, 당신은 속성 또는 클래스 폭/글로벌 가변

액세스 제어와 같은 정의하지 않으려면 - 정말

for (int index = 0; index < [self.view.subviews count]; index++) { 
    if([[self.view.subviews objectAtIndex:index] isKindOfClass:[UISegmentedControl class]]) { 
     UISegmentedControl *seggie = (UISegmentedControl *) [self.view.subviews objectAtIndex:index]; 
     [seggie setSelectedSegmentIndex:0]; 
    } 
} 

아니 코멘트하지만, 몇 가지 일반적인 조언을

예, 뷰를 얻는 데 가장 비효율적 인 방법 일 것입니다.처음에는

당신이 적어도 정말

[[[self view] subviews] objectAtIndex:index] 

방법 발송 인

[self.view.subviews objectAtIndex:index] 

전화의 반복 사용을 제거 할 수 있습니다 빠른 열거를 사용하는 경우는 빠른하지만 아무튼 실제로 코드가 실제로 무엇을하는지 생각하면 안됩니다.

코드가 모두 동일하게 처리 (예 : 0으로 설정)되어 있으므로 코드가 여러 컨트롤을 고려하지 않습니다.

이후에 개체를 찾으면이 루프에서 조기 종료 할 수 없습니다. 당신의 의견을 통해 자전거를 주장하는 경우 적어도 잘 그것을 -

for (UISegmentedControl *seggie in [self.views.subviews]) { 
    if ([seggie isKindOfClass:[UISegmentedControl class]]) { 
     seggie.selectedSegmentIndex = 0; 
     break; 
    } 
} 
+0

클래스 와이드 변수가 무엇을 의미하는지 확실히 알 수는 없지만 전역 변수는이 경우에는 최선의 방법이 아닙니다. 속성이나 오래된 학교 인스턴스 변수가 기존의 방법으로 사용될 수 있습니다. 플랫폼을 처음 사용하는 사람에게는 나쁜 접근 방법이 아닙니다. – Monolo

+0

@ Monolo - Agree ... 가장 좋은 방법은 속성 또는 인스턴스 변수를 사용하는 것입니다. – rishi

+0

이 경우 속성과 인스턴스 변수 중 하나를 선택하는 것은 개인적인 취향의 문제, 특히 인스턴스 변수의 메모리 관리를 담당하는 ARC의 경우 매우 중요합니다. 개인적으로 나는 .m 파일에서 선언 된 인스턴스 var를 공용 인터페이스에서 숨기도록 선택합니다. 그러나 당신이 그것을 클래스 또는 글로벌 변수로 만들지 않는 한, 당신은 훌륭합니다. – Monolo

3

은 당신이 할 수있는 2 가지 방법이 있습니다 : -

1> 하나의 세계적인 .H 파일에 UISegmentedControl의 객체를 (선언) 다른 클래스에서 액세스하고 싶지 않으면 같은 클래스에 속성이 필요하지 않습니다.

2

은> 당신은 parentview의 파단을 반복하고 UISegmentedControl을 얻을과 같은 작업 perfrom에 형태 캐스트 할 수 있습니다 : -

NSArray *subviewss=[self.view subviews]; 
for(int i=0;i<[subviewss ;i++]) 
{ 
if([[subviews objectAtIndex:i] isKindOfClass:[UISegmentedControl class]]) 
{ 
UISegmentedControl *segmentControl= (UISegmentedControl *) [subviewss objectAtIndex:i]; 
[segmentControl setSelectedSegmentIndex:0]; 

} 
} 

하지만 위의 코드는 당신이 단 하나의 세그먼트가있는 경우에만 WRK됩니다 루프를 귀하의 viewcontroller에서 하위보기로 컨트롤을 다른 종류의 UISegmentedControl 클래스 유형의 충돌합니다.

관련 문제