본문 바로가기
🌱

Image View를 랜덤하게 바꾸기

by 방우 2022. 7. 5.

특정 버튼을 클릭할 때마다 이미지가 달라지게 하고 싶다면?

 

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