-
20240531_프로젝트 발표_@IBOutlet, @IBAction Practice개발...................../TIL 2024. 6. 1. 00:02
오늘은 프로젝트 발표까지 마쳤습니다! 다음주부터는 새로운 팀원들을 만나게 됩니다. 벌써 다음주 하고 싶었던 것들을 계획하고 있었는데 급하게 팀편성이 바뀌어 아쉽지만 이번 프로젝트를 진행하면서 느낀 것들을 적어보면서 계속 앞으로 나가기 위한 준비를 해보려고 합니다.
이번 팀활동 중
* 앞으로도 지키고 싶은 것들 : 지식 객관화를 하고, 개인별 부족한 역량에 대해 스터디 진행
* 문제점 : 여러 팀원이 페이지를 할당받아 작업할 때 각 아이콘의 명칭을 알지 못해서 빠른 피드백과 작업이 어려웠음
* 앞으로의 계획 : 실습해보면서 모든것에 질문하고, 답을 찾아가는 습관과 개인 공부 전념하고 다른 조에서 잘한 부분을 착안해 다음 프로젝트에 디벨롭
IBOutlet (Interface Builder Outlet)
IBOutlet은 Interface Builder에서 정의한 사용자 인터페이스 요소를 코드에서 참조할 수 있게 해주는 속성입니다. 이를 통해 코드에서 UI 요소를 제어할 수 있습니다.
예를 들어, 버튼, 레이블, 텍스트 필드 등과 같은 UI 요소들을 IBOutlet으로 정의할 수 있습니다. IBOutlet은 보통 클래스의 인스턴스 변수로 정의됩니다.
import UIKit class ViewController: UIViewController { @IBOutlet weak var myLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() // myLabel을 통해 Interface Builder에서 연결된 레이블을 제어할 수 있습니다. myLabel.text = "Hello, World!" } }
여기서 @IBOutlet weak var myLabel: UILabel!는 Interface Builder에서 myLabel이라는 레이블을 연결한 것입니다.
IBAction (Interface Builder Action)
IBAction은 Interface Builder에서 정의한 사용자 인터페이스 요소와 상호작용(예: 버튼 클릭)을 처리할 수 있게 해주는 메서드입니다. 이를 통해 사용자가 UI 요소와 상호작용할 때 발생하는 이벤트를 처리할 수 있습니다.
예를 들어, 버튼을 클릭했을 때 특정 동작을 수행하도록 IBAction을 정의할 수 있습니다.
import UIKit class ViewController: UIViewController { @IBOutlet weak var myLabel: UILabel! override func viewDidLoad() { super.viewDidLoad() } @IBAction func buttonClicked(_ sender: UIButton) { // 버튼이 클릭되었을 때 myLabel의 텍스트를 변경합니다. myLabel.text = "Button Clicked!" } }
여기서 @IBAction func buttonClicked(_ sender: UIButton)는 Interface Builder에서 버튼과 연결된 메서드입니다. 버튼이 클릭되었을 때 이 메서드가 호출됩니다.
정리
- IBOutlet: 코드와 Interface Builder에서 정의한 UI 요소를 연결하는 데 사용되는 속성.
- IBAction: 코드와 Interface Builder에서 정의한 UI 요소의 이벤트를 연결하는 데 사용되는 메서드.
이를 통해 개발자는 UI 요소를 쉽게 제어하고, 이벤트를 처리할 수 있게 됩니다. Xcode의 Interface Builder를 사용하여 이러한 연결을 시각적으로 설정할 수 있습니다.
오늘 시도한 것들
실습 1.
Label과 Button IBOutlet, IBAction 시도 중 발생한 문제를 다뤄보려고 합니다.
Button을 눌렀을 때 '반가워요'라는 문장이 나오도록 연결을 시도 했지만,
Console View에 이런 메시지 창이 떴습니다.
*** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<my_Action.ViewController 0x1027095c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key helloLabel.'
- 메시지 내용 : NSUnknownKeyException이라는 예외 발생
- 이유 : 'ViewController' 클래스에 'helloLabel'이라는 키가 존재하지 않기 때문
- 해결 방법 리서치 : stackoverflow, ChatGPT
혹시 위와 같은 오류를 마주하셨다면 아래 내용에 대해 점검해보시는 걸 추천드립니다.
- 잘못된 연결 제거: Connections Inspector에서 잘못된 IBOutlet 연결을 제거합니다.
- ViewController의 IBOutlet 확인: Swift 파일에서 IBOutlet이 올바르게 정의되어 있는지 확인합니다.
- 새 연결 설정: 스토리보드에서 UILabel을 ViewController의 IBOutlet과 다시 연결합니다.
연결을 여러번 재시도 하는 과정에서 이름을 바꿨는데 그전에 연결되었던 helloLabel을 Viewcontroller에서 삭제하면서 연결이 끊긴줄 알았지만 유지되어 있어서 해당 오류가 발생된 것을 확인했습니다.
myTroubleShooting
: 스토리보드 > 해당 Lable 우클릭 > 이전 명칭으로 연결된 부분 확인 > 연결 해제
논외로 주의할 점
스토리보드에서 다른 버튼을 기존 버튼을 복사해서 사용할 때,
기존에 로직이 연결되어 있기 때문에 connection instpector나 우클릭을 통해 연결 여부를 확인하고 되어있다면 끊어주는 과정이 필요합니다. 이미 있는 기능을 웬만하면 복붙하지 않는 것이 좋겠습니다 ㅎㅎ
위 Touch Button을 그대로 복사했을 경우,
라이브러리에서 새로 가져오고 이름을 변경했을 때
실습 2.
강의 실습 중에 스토리보드와 로직을 연결하는 과정에서 두 개의 label을 IBOutlet 연결까지는 했지만, IBAction 연결이 안 되어서 고민이었는데 팀원분들이랑 대화 후 Button으로 변경해보니 IBAction 연결을 완료했습니다.
문제 원인
- UILabel은 주로 텍스트를 표시하는 데 사용되며, 기본적으로 사용자가 인터랙션할 수 있는 요소가 아닙니다. 따라서 UILabel은 사용자 인터랙션(즉, 액션 이벤트)을 받을 수 있는 대상이 아닙니다. 반면, UIButton은 사용자 인터랙션을 받을 수 있는 요소로, 다양한 액션 이벤트를 처리할 수 있습니다.
해결 방법 및 이유
- UIButton으로 IBAction을 연결하면, 버튼이 사용자 인터랙션을 받을 수 있는 요소이기 때문에 문제 없이 연결이 가능합니다. UIButton은 기본적으로 터치 이벤트를 처리할 수 있도록 설계되어 있으며, 이를 통해 다양한 액션을 처리할 수 있습니다.
'개발..................... > TIL' 카테고리의 다른 글
20240604_myCompiler, if문 실습 예제 (0) 2024.06.06 20240531_isHidden 속성 사용하기 (0) 2024.06.01 20240529_Xcode_Debug Area Interface (2) 2024.05.29 20240528_미니프로젝트_오토레이아웃을 위한 StackView 사용 (0) 2024.05.29 20240527_개강입니다. (0) 2024.05.27