IB 아울렛 및 IBAction


159

Xcode 및 Interface Builder에서 IBOutlets 및 IBAction을 사용하는 목적은 무엇입니까?

IBOutlets 및 IBActions를 사용하지 않으면 차이가 있습니까?


빠른:

@IBOutlet weak var textField: UITextField!

@IBAction func buttonPressed(_ sender: Any) { /* ... */ }

목표 -C :

@property (nonatomic, weak) IBOutlet UITextField *textField;

- (IBAction)buttonPressed:(id)sender { /* ... */ }

12
모든 답변에 동일한 유형의 아이디어가 언급되어 있지만 소스에 IBAction / IBOutlet을 포함시키지 않으면 Interface Builder가 왜 동일하게 작동하는지에 대해서는 아무도 설명하지 않습니다. IBAction 및 IBOutlet에 대한 또 다른 이유가 있습니까? 아니면 그대로 두어야 합니까?
bobobobo

2
Michael Rogers의 답변은 IBAction이 생략 된 경우에도 코드가 작동하는 이유에 대한 약간의 설명을 추가합니다.
크리슈나

IBActions는 타겟 - 액션의 상호 작용 메커니즘의 일부로 존재, 당신은 IBAction를 여기에 그에 맞는 방법에 대해 읽을 수 있습니다 : developer.apple.com/library/ios/documentation/General/...는 현재 콘센트에 읽을 수 있습니다 developer.apple를. com / library / ios / documentation / General /…
William Power

답변:


208

IBActionIBOutlet인터페이스 빌더로 지칭 될 수 나타내고 변수 및 방법에 정의 된 매크로이다.

IBAction로 확인 void하고 IBOutlet아무것도 해결되는, 그러나 그들은 이러한 변수와 메소드 엑스 코드와 인터페이스에 빌더한다는 의미는 코드에 링크 UI 요소에 인터페이스 빌더에서 사용할 수 있습니다.

Interface Builder를 전혀 사용하지 않을 경우 코드에서 필요하지 않지만 IBActionIB에서 사용할 메소드와 IBOutlet객체 에 대해 지정해야 합니다. IB에서 사용될 것입니다.


@Jasarien "IB에서 사용될 객체에 대해 IBction을 지정하고 IB에서 사용될 객체에 대해 IBOutlet을 지정해야합니다." 차이점이 뭐야 ?
cyrilchampier

3
@nerith 메소드와 객체 사이에 동일한 차이점이 있습니다. 메소드에 대한 IBActions, 오브젝트에 대한 IBOutlet
Jasarien

명확히하기 위해 내 게시물이 편집되었으므로로 확인 IBOutlet되지 않습니다 id. 이것을 고려하십시오 : IBOutlet UILabel *nameLabel;-로 IBOutlet해결 되면 id해당 코드를 읽고 id UIlabel *namelabel;컴파일러 오류가 발생합니다. 원래 언급했듯이 IBOutlet아무것도 해결되지 않습니다.
Jasarien

38

인터페이스 빌더에 표시되도록 메소드를 플래그 지정하고 연결을 끌어 올 수있는 전통적인 방법은 메소드가 유형 IBAction을 리턴하도록하는 것입니다. 그러나 메소드를 void로 설정하고 대신 (IBAction은 # define'd void), (id) 인수를 제공하면 메소드가 여전히 표시됩니다. 이것은 추가 유연성을 제공합니다.

이 세 가지 모두 Interface Builder에서 볼 수 있습니다.

-(void) someMethod1:(id) sender; 
-(IBAction) someMethod2; 
-(IBAction) someMethod3:(id) sender;

자세한 내용은 특히 Apple의 인터페이스 빌더 사용 설명서를 참조하십시오 (특히 Xcode 통합 섹션).


1
위의 가이드에 대한 링크는 다음과 같습니다. developer.apple.com/library/ios/recipes/…
공격자

32

GUI 구성 요소에 인터페이스 빌더 (따라서 IB 접 두부)를 사용하는 경우 IBOutlet 및 IBAction을 사용해야합니다. IBOutlet은 애플리케이션의 특성을 IB의 컴포넌트와 연관시키는 데 필요하며 IBAction은 메소드를 IB의 조치와 ​​연관시키는 데 사용됩니다.

예를 들어, IB에서 단추와 레이블을 정의한다고 가정하십시오. 버튼을 눌러 레이블 값을 동적으로 변경하려면 앱에서 다음과 유사한 동작 및 속성을 정의합니다.

UILabel IBOutlet *myLabel;
- (IBAction)pushme:(id)sender;

그런 다음 IB에서 myLabel을 레이블과 연결하고 pushme 메소드를 단추와 연결합니다. 이러한 연결이 IB에 존재하려면 IBAction 및 IBOutlet이 필요합니다.


13
그러나 IBOutlet 라벨링을 포함시키지 않으면 왜 여전히 작동 합니까?
bobobobo

7
이러한 매크로는 컴파일 타임에 아무 것도 수행하지 않기 때문에 인터페이스 빌드 앱이 소스 코드에서 해당 메소드 및 인터페이스 빌더 파일을 찾을 수 있으므로 인터페이스 빌더와 코드 사이를 드래그 할 수 있습니다. 더 이상 문제.
Nathan Day

IBAction은 적어도 지난 10 년 동안 편집시 아무것도 수행하지 않습니다. (void)Interface Builder에서도 메소드를 연결할 수 있습니다 .
J. Cocoe

7

Interface Builder는이를 사용하여 창 /보기에서 사용중인 인터페이스 컨트롤에 '연결'할 수있는 멤버 및 메시지를 결정합니다.

IBOutlet과 IBAction은 디자인 타임에 코드를 구문 분석 할 때 Interface Builder가 찾는 마커로서 순수하게 존재하며 컴파일러에서 생성 한 코드에는 영향을 미치지 않습니다.


7

키-값 코딩을 보면서 다이어그램을 살펴보면 누군가에게 도움이 될 것이라고 생각했습니다. IBOutlet이 무엇인지 이해하는 데 도움이됩니다.

흐름을 살펴보면 IBOutlets가 속성 이름과 Nib 파일의 컨트롤 이름을 일치시키기 위해서만 있다는 것을 알 수 있습니다.

nib 파일로드 방법, iOS6 용 Matt 온라인 설명서의 스크린 샷


이 답변에 대해 설명 하는 이유방법 IBOutlets이 아니라, 일을 그들이 무엇 .
Jeffery Opoku-Mensah

4

콘센트는 코드에서 UI 로의 링크입니다. UI 요소를 표시하거나 숨기려면 텍스트 필드의 텍스트를 가져 오거나 요소 (또는 다른 수백 가지)를 활성화 또는 비활성화하려면 소스에서 해당 객체의 콘센트를 정의하고 해당 콘센트를 연결해야합니다 "인터페이스 객체"를 통해 UI 요소에 그런 다음 코딩의 다른 변수와 마찬가지로 콘센트를 사용할 수 있습니다.

IBAction – 사용자 인터페이스 개체에 의해 트리거되는 특수한 방법입니다. 인터페이스 빌더가이를 인식합니다.

@interface Controller
{
  IBOutlet id textField; // links to TextField UI object
}

- (IBAction)doAction:(id)sender; // e.g. called when button pushed

자세한 내용은 Apple Docs 를 참조하십시오.


아뇨, 그건 IBOutlet이 아닙니다. 그 아이디어를 어디서 얻었습니까?
Richard J. Ross III

3

IBAction 및 IBOutlets는 Interface Builder에서 만든 인터페이스를 컨트롤러와 연결하는 데 사용됩니다. Interface Builder를 사용하지 않고 코드로 인터페이스를 완전히 빌드하지 않으면 인터페이스를 사용하지 않고 프로그램을 만들 수 있습니다. 그러나 실제로 우리 대부분은 Interface Builder를 사용합니다. 일단 인터페이스에서 대화 형 기능을 사용하려면 IBActions 및 IBoutlet을 사용해야합니다.


2

IB 아울렛

  • 그것은이다 재산 .
  • nib (IB) 파일이로드되면 파일은 인스턴스 변수에 연결되는 캡슐화 된 데이터의 일부가됩니다.
  • 각 연결은 보관되지 않고 재설정됩니다.

IBAction

  • 속성 은 메소드가 인터페이스 빌더의 스토리 보드에서 연결할 수있는 조치임을 나타냅니다.

@-동적 패턴 IB-인터페이스 빌더


2

이 질문에 대한 최고 의견 중 하나는 구체적으로 묻습니다.

모든 답변에 동일한 유형의 아이디어가 언급되어 있지만 소스에 IBAction / IBOutlet을 포함시키지 않으면 Interface Builder가 왜 동일하게 작동하는지에 대해서는 아무도 설명하지 않습니다. IBAction 및 IBOutlet에 대한 또 다른 이유 가 있습니까? 아니면 그대로 두어야합니까?


이 질문은 NSHipster가 잘 대답합니다.

IBAction

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#ibaction

2004 년 초 (아마도 일찍) IBAction은 더 이상 필요하지 않았습니다 Interface Builder가 메소드를 알아 차릴 . 서명 -(void){name}:(id)sender이있는 방법 은 콘센트 창에 표시됩니다.

그럼에도 불구하고 많은 개발자들은 특정 메소드가 액션에 의해 연결되어 있음을 나타 내기 위해 메소드 선언에서 IBAction 반환 유형을 계속 사용하는 것이 유용하다고 생각합니다. 스토리 보드 / XIB를 사용하지 않는 프로젝트조차 대상 / 동작 방법을 호출하기 위해 IBAction을 사용하도록 선택할 수 있습니다.

IB 아울렛 :

https://nshipster.com/ibaction-iboutlet-iboutletcollection/#iboutlet

IBAction과 달리 IBOutlet은 여전히 ​​필요합니다 스토리 보드 또는 XIB의 객체와 코드의 속성을 연결하는 합니다.

IBOutlet 연결은 일반적으로보기 또는 제어와 해당 관리보기 컨트롤러간에 설정됩니다 (이는 종종보기 컨트롤러가 응답자가 수행 할 수있는 IBAction에 추가하여 수행됨). 그러나 IBOutlet을 사용하여 다른 컨트롤러 나 참조 뷰 컨트롤러에서 액세스 할 수있는 속성과 같은 최상위 속성을 노출 할 수도 있습니다.


1

Interface Builder를 사용할 때 Connections Inspector를 사용하여 이벤트 핸들러로 이벤트를 설정할 수 있으며, 이벤트 핸들러는 IBAction 수정자가있는 함수로 간주됩니다. 뷰는 동일한 유형의 참조 및 IBOutlet 수정 자와 연결될 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.