특정 버튼을 클릭할 때마다 이미지가 달라지게 하고 싶다면?
view의 이미지를 뷰컨드롤러에 연결하는 것을 저번 포스팅에서 다뤘다.
이번에는 특정 버튼(재생버튼)을 누르면 랜덤하게 이미지가 바뀌는 것을 다룰 것이다. 아래처럼.
IBAction
@IBOutlet weak var posterImageView: UIImageView!
저번 포스팅에서 IBOutlet이 나왔었다.
오늘 배운 바로는
@IBOutlet의 IB는 Interface Bulilder의 축약이고, StoryBoard상에 선언한 View 객체를 Interface Builder(IB) 가 알아볼 수 있게 만드는 것이다. 다음에 var가 나오는데 상수가 아닌 변수로 선언하는 이유는 View 객체를 우리가 마음대로 변경할 것이기 때문~(이미지 뷰의 모서리 모양 조절, 그림자, 애니메이션 등)
이외 등장하는 weak(약한참조)는 이후에 더 공부하고 수정해서 재업하겠다. 메모리는 너무 어려워.
Swift에서는 옵셔널을 쓸 때 강제 언래핑은 삼가라고 한다. 하지만 아웃렛에서는 언래핑을 강제로 해주고 있다. 왜?
이부분은 멘토님이 다음에 더 설명해주신다고 했지만 궁금해서 찾아보았다..ㅎ공식문서의 글을 찾고싶었는데 내 검색실력 부족인지 나오지 않아 블로그글을 풀어쓴다.
스위프트는 강제언래핑을 지양한다. 런타임에러가 발생할 수 있기 때문이다. 굳이 써야한다면 nil일 수 없는 확신의 상황(?) 혹은
nil이면 안되는 상황이랄까. 또한 스위프트는 불필요한 선언을 지양한다.즉, 아웃렛에 강제언래핑을 해준 것은, 아웃렛 자체가 특정 View 객체를 연결했기 때문에 nil일 수 없으며 만약 nil이라면 앱을 죽게해서라도 수정해야하기 때문이다. 그러니까 아웃렛 사용하지도 않을거면 선언하지 말라 이건가.
돌아와서
IBAction
@IBAction func resultButtonClicked(_ sender: UIButton) {...}
IBAction은 스토리보드 상에 선언한 View 객체가 특정 이벤트가 발생했을 경우 호출되는 함수 라고 생각하면 된다.
예를 들어 버튼 클릭 시 음악이 재생되거나, 카메라가 실행되거나, 로그인이 되는 등
(액션이 가능해야해서 Image View는 IBAction으로 선언이 안되더라)
override func viewDidLoad() {...}
를 기준으로 위에 드래그앤드롭해주면 아웃렛으로 자동설정되고, 아래에 드래그앤드롭해주면 IBAction이 자동설정된다. 자리가 있다는 뜻이 아니고 설정을 다르게 해줄 수 있지만 뷰 객체의 아웃렛은 뷰가 로드되기 전에 이미 되어있고, 액션은 뷰가 로드된 이후에 해주는 것이 자연스러워서인듯하다.
먼저 Assets에서 랜덤으로 등장하길 원하는 이미지들의 이름을 통일성있게 작성해준다.
나는 영화라서 movie1, movie2, movie3 ... 이렇게~
우리는 액션을 만들거니까 아래에 드래그앤드롭해주고 함수 안에 코드를 작성한다.
@IBAction func resultButtonClicked(_ sender: UIButton) {
//버튼을 눌렀다가 뗐을 때 실행되는 것 -> touch up inside
posterImageView.image = UIImage(named: "movie\(Int.random(in: 1...7))")
}
UIImage(named: "movie\(Int.random(in: 1...7))")
-> 앞의 movie는 공통적이고 뒤의 수만 다르니까 문자열보간법으로 랜덤메서드를 작성해준다.
그럼 끝
🐾 오늘의 회고
오늘 조금 졸아서 버튼의 크기를 줄일 수 있는 방법을 놓쳤다... 벌써 이러면 안되는데...내일은 쓰리샷으로....더위는 커피로 이겨내자...
'🌱' 카테고리의 다른 글
[iOS] Storyboard Reference (0) | 2022.07.13 |
---|---|
@available, #available, unavailable (0) | 2022.07.10 |
UIWindow (0) | 2022.07.10 |
앱의 생명주기/ Scene (0) | 2022.07.07 |
Swift UIImageView을 Circle로 만들기 (0) | 2022.07.05 |