2012-03-06 4 views
2

StackOverflow에서이 주제에 관해 몇 가지 비슷한 질문을 읽었지 만 그 중 어느 것도 내 경우에는 적용되지 않습니다.UIToolbar의 중간에있는 UIBarButtonItem 표시/숨기기

내 응용 프로그램에 UIToolbar가 있습니다. ToolBar에는 다음과 같은 레이아웃이 있습니다.

(Button #1) (Button #2) (Button #3) <--- Flex Controller ---> (Button #4) 

는 UIToolbar의 중간에 있기 때문에 /이 Button #3 UIBarButtonItem을 숨기기 표시하는 가장 효율적인 방법은 무엇입니까?

FOLLOW-UP

나는 setItems:Animated 방법을 알고 있지만, 내 모든 버튼이 IB를 통해 유선하고 그들이 IBActions 관련된 때문에이 문제가 될 수 있었던 것처럼이 보인다.

내 버튼 # 3이 숨겨져있을 때 (ARC를 사용하고 있기 때문에) 버튼 3을 유지할 방법을 찾아야한다는 의미입니까? 추가 및 제거에 가장 효율적이고 효율적인 방법을 찾고 있습니다. 이 물건들. # 3 버튼을 표시/숨길 때마다이 목록을 다시 만들어야합니다. 그게 내가 할 일입니다.

너무 비효율적 인 것처럼 보입니다.

+0

아마도 이미 시도했지만 버튼의 'hidden'속성을 사용할 수 없습니까? – Novarg

+0

@Novarg : UIButton에서 상속되지 않으므로 해당 속성을 UIBarButtonItem에서 사용할 수 없습니다. – RLH

+0

단추를 IBOutlets로 연결하면 도구 모음의 항목을 조정할 때 단추를 참조 할 수 있습니다. 문제를 단순화하기 위해이 작업을 수행 할 때 사용하는 방법을 설명하는 답변을 넣었습니다. – Chad

답변

3

나는 다음과 같은 방식으로 도우미 함수를 구축하는 것이 좋습니다 : 이것은 당신이 그것을 업데이트해야하고 당신은 쉽게/추가 버튼을 제거 할 수 있습니다 때마다 사용할 수 있다는 장점을 가지고

- (void) setToolbarItems:(BOOL) button3Shown { 
    NSMutableArray *items = [NSMutableArray arrayWithCapacity:5]; 
    [items addObject:button1]; 
    [items addObject:button2]; 
    if(button3Shown) { 
     [items addObject:button3]; 
    } 
    [items addObject:[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil]]; 
    [items addObject:button4]; 
    [self.toolbar setItems:[items copy] animated:YES]; 
} 

합니다. 이 작업을 수행하려면 구현 파일에서 버튼을 IBOutlets로 사용할 수 있어야하며 툴바 재 작성을 위해이 버튼을 쉽게 참조해야합니다.

+0

참고로, 이것은 훌륭한 해결책이지만'initWithCustomView :'메소드로 생성 된'UIBarButtonItem'도 프레임을 설정해야합니다. – oflannabhra

4

UIToolBar.h에 보면, 다음과 같은 방법이있다 :

- (void)setItems:(NSArray *)items animated:(BOOL)animated; // will fade in or out or reorder and adjust spacing 
당신은 같은 것을 할 수 있어야

: 참조

NSMutableArray *items = [toolBar.items mutableCopy]; 
[items removeObjectAtIndex:2]; 
[toolBar setItems:items animated:YES]; 

을 그건 당신이

찾고있는 방식으로 작동하는 경우
+0

+1 분이 끝나면 :) – Jim

+1

자, 일단 보여 주어야만 제거 된 항목에 어떻게 다시 추가 할 수 있습니까? 참고로 버튼은 IB를 통해 연결되며 관련 IBAction이 있습니다. – RLH

+0

'UIBarButtonItem'을 인스턴스 변수에 저장하고 비슷한 절차를 거쳐 나중에 다시 추가해야합니다. IB로부터 오는 것이 무엇이든 영향을 미치지 않아야합니다. –

0

UIBarButtonItems의 다른 배열을 만들고 런타임에 UIToolbar에 추가/제거하면 실행의 복잡성이 증가 할 수 있습니다.

나는 다른 접근법을 사용하여 그것을했습니다. 그것을 달성하기위한 발췌 문장은 다음과 같습니다.

1 단계 : IBOutlet을 만들거나 UIToolbar 인스턴스를 만듭니다.

UIToolbar *toolBar = [UIToolbar alloc] init]; 

원하는 경우 스타일을 설정하십시오.

2 단계 : UIButton 유형 인스턴스를 생성하십시오.

UIButton *button1, *button2; 

3 단계 : 필요하면 이미지를 버튼에 지정하십시오.

button1 = [UIButton alloc] initWithFrame:CGRectMake(0.f,0.f,30.f,30.f); 
    [button1 setBackgroundImage:[UIImage imageNamed:@"image1.png"] forState:UIControlStateNormal]; 

    button2 = [UIButton alloc] initWithFrame:CGRectMake(0.f,0.f,30.f,30.f); 
    [button2 setBackgroundImage:[UIImage imageNamed:@"image2.png"] forState:UIControlStateNormal]; 

4 단계 : 사용자 지정보기로 위의 버튼과 UIBarButtonItem 인스턴스를 생성합니다.

UIBarButtonItem *toolbarbuttonItem1 = [UIBarButtonItem alloc] initWithCustomView:button1]; 
    UIBarButtonItem *toolbarbuttonItem2 = [UIBarButtonItem alloc] initWithCustomView:button1]; 

5 단계 : 툴바에 바 버튼 항목을 지정하십시오.

toolBar.items = [NSArray arrayWithObjects:toolbarbuttonItem1,toolbarbuttonItem2,nil]; 

6 단계 : 도구 모음을 VIEW에 추가하십시오.

7 단계 : VIEW에 UIButton IBOutlet을 만들고 click 이벤트를 할당하십시오.

숨기기를 전환하려면 다음 도우미 메서드 int click 이벤트를 호출하십시오.

- (void) toggleToolbarButtons { 
      button1.hidden = !button1.hidden; 
      button2.hidden = !button2.hidden; 
    } 

희망 하시겠습니까?

0

툴바 항목 item1, item2 및 item3에 대한 기존 참조를 사용하면 가장 간단한 방법은 모든 항목을 제거한 다음 원하는 순서로 각 항목을 다시 추가하는 것입니다. 이 코드는 UIToolbar 서브 클래스 내에서 존재의 관점에서 기록됩니다

let flexSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.flexibleSpace, target: nil, action: nil) 
let fixedSpace: UIBarButtonItem = UIBarButtonItem(barButtonSystemItem: UIBarButtonSystemItem.fixedSpace, target: nil, action: nil) 

self.items?.removeAll() 
self.items?.append(flexSpace) 
self.items?.append(item1) 
self.items?.append(fixedSpace) 
self.items?.append(item3) 
self.items?.append(fixedSpace) 
self.items?.append(item2) 

이 항목 참조는 IBOutlets에서 할 수있다. 이러한 참조를 IB가 삽입 된 기본 약한 참조가 아닌 강하게 변경하면 UIToolbar는 해당 항목이 제거 된 경우에도 이러한 항목에 대한 참조를 유지하므로 관련 IBAction 함수 관계가 유지됩니다.

모든 항목-설정을 다시 할 필요없이 UIToolbar 서브 클래스 내에서 UIToolbar에서 특정 항목을 제거하려면 :

if let index = self.items?.index(of: buttonToRemove) { 
    self.items?.remove(at: index) 
} 

UIToolbar 서브 클래스 내에서 그렇지 않은 경우, 단순히 UIToolbar에 대한 참조 자체를 교체 전역.

관련 문제