[새싹 iOS] 1주차_코드

임승섭·2023년 7월 22일
0

새싹 iOS

목록 보기
2/45

DatePicker

//
//  TestViewController.swift
//  NewlyCoinedWord
//
//  Created by 임승섭 on 2023/07/20.
//

import UIKit

class TestViewController: UIViewController {

    
    // 스토리보드 상에서 Outlet을 땡겨올 때 자동으로 옵셔널 타입으로 저장되는데,
    // 아예 느낌표를 없애거나, 물음표를 붙여줘도 된다 (살짝 강도를 낮춰주는 용도)
    // 만약 물음표를 썼다면, 아래 함수에서 해당 변수를 사용할 때 옵셔널 바인딩을 해주어야 한다
    /* (1).
     if background100ImageView != nil {
        background100ImageView!.ayer.cornerRadius = 20
     }*/
    /* (2).
     background100ImageView?.layer.cornerRadius = 20
     */
    // 근데 이렇게까지 할 바에는, 그냥 느낌표로 땡겨오는 게 낫다

    
    @IBOutlet var datePicker: UIDatePicker!
    @IBOutlet var background100ImageView: UIImageView!
    @IBOutlet var date100Label: UILabel!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        designDatePicker()
        testViewProperty()
    }
    
    
    @IBAction func datePickerValueChanged(_ sender: UIDatePicker) {
        // 둘 다 같은 값을 출력한다
        print(datePicker.date)
        print(sender.date)
        
        // + 100일 뒤 계산
        // sender.date에 날짜를 + 100 day 해서, 그걸 Date? 타입으로 저장한다
        let result = Calendar.current.date(byAdding: .day, value: 100, to: sender.date)
        print(result)
        
        
        // sender.date를 출력하면, 시간이 이상한 걸 확인할 수 있다
        // 영국 표준시를 기준으로 하기 때문에 시차가 발생한다
        
        // DateFormatter의 역할 : 1. 시간대 변경 / 2. 날짜 포맷 변경
        let format = DateFormatter()
        format.dateFormat = "MM월 dd일, yyyy"
        //let value = format.string(from: sender.date)
        let value = format.string(from: result!)
        print(value)
        
        date100Label.text = value   // 100일 후의 날짜(Date)를 문자열로 바꿔서 label에 출력되도록 한다
    }
    
    
    func testViewProperty() {
        // 모서리를 둥글게 하고 싶을 때, clipsToBounds 부터 확인한다
        
        // label의 모서리를 둥글게 한다
        date100Label.clipsToBounds = true
        date100Label.layer.cornerRadius = 20
        
        
        // cornerRadius : 바깥을 깎아낸다
        // shadow : 바깥을 채워준다
        // clipsToBounds의 값에 따라 둘 중 하나만 적용할 수 있다.
        
        background100ImageView.layer.cornerRadius = 20
        background100ImageView.layer.shadowColor = UIColor.red.cgColor
        background100ImageView.layer.shadowOffset = .zero   // 그림자의 방향
        // background100ImageView.layer.shadowOffset = CGSize(width: -10, height: 10)
        background100ImageView.layer.shadowRadius = 10     // 그림자 퍼짐의 정도
        background100ImageView.layer.shadowOpacity = 0.5   // 불투명도
        //background100ImageView.image = UIImage(named: "doughnut")
        background100ImageView.clipsToBounds = false
        // 이 예시에서는 ImageView 안에 따로 이미지를 넣지 않고 배경색만 지정해주었기 때문에
        // 모서리도 둥글고, 그림자도 생긴다
        // 하지만 실제 이미지를 넣어주면 두 개를 동시에 구현하는 것이 어렵기 때문에
        // 여러 layer를 만들어서 역할 분담을 시켜준다
        
    }
    
    func designDatePicker() {
        
        datePicker.tintColor = .red
        
        // .inline은 14.0 이상에서 등장한 스타일
        // 조건문을 이용해서 14 이하인 버전이면 wheel 방식으로 쓰게 하자
        if #available(iOS 14.0, *) {
            datePicker.preferredDatePickerStyle = .inline
        } else {
            datePicker.preferredDatePickerStyle = .wheels
        }
    }
}

Netflix

//
//  mainScreenViewController.swift
//  0719hw
//
//  Created by 임승섭 on 2023/07/19.
//

import UIKit


class mainScreenViewController: UIViewController {
    
    // 미리보기 포스터
    @IBOutlet var previewFirstImageView: UIImageView!
    @IBOutlet var previewSecondImageView: UIImageView!
    @IBOutlet var previewThirdImageView: UIImageView!
    @IBOutlet var posterImageView: UIImageView!
    
    
    
    @IBOutlet var randomPlayButton: UIButton!
    @IBOutlet var informationLabel: UILabel!
    
    // 이미지에 보여줄 그림 이름
    let random = [1, 2, 3, 4, 5]
    let random2 = ["극한직업", "도둑들", "명량", "부산행", "신과함께인과연", "베테랑"]
    let random3 = ["신과함께죄와벌", "아바타", "알라딘", "암살", "어벤져스엔드게임"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
     
        
        showRandomMovie()
        designPreviewImageView(previewFirstImageView, borderColor: UIColor.red.cgColor)
        designPreviewImageView(previewSecondImageView, borderColor: UIColor.red.cgColor)
        designPreviewImageView(previewThirdImageView, borderColor: UIColor.red.cgColor)
        
        
        
        designRandomPlayButtonAction()
        
        let randomResult2 = random2.randomElement()!
        previewSecondImageView.image = UIImage(named: randomResult2)
        
    }
    
    
    
    @IBAction func likeButtonClicked(_ sender: UIButton) {
        // (1)
        let alert = UIAlertController(title: "이곳이 타이틀입니다", message: "이러쿵 저러쿵 내용을 작성하세요", preferredStyle: .alert)
        
        // (2)
        let cancel = UIAlertAction(title: "취소", style: .cancel)
        let ok = UIAlertAction(title: "확인", style: .default)
        
        // (3)
        alert.addAction(cancel)
        alert.addAction(ok)
        
        // (4)
        present(alert, animated: true)
    }
    
    
    @IBAction func playButtonClicked(_ sender: UIButton) {
        showRandomMovie()
    }
    
    
    // 함수로 정리
    func showRandomMovie() {
        
        let randomResult = random.randomElement()!
        let randomResult2 = random2.randomElement()!
        let randomResult3 = random3.randomElement()!
        
        previewFirstImageView.image = UIImage(named: "\(randomResult)")
        previewSecondImageView.image = UIImage(named: "\(randomResult2)")
        previewThirdImageView.image = UIImage(named: "\(randomResult3)")
    }

    
    func designPreviewImageView(_ name: UIImageView, borderColor: CGColor) {
        name.layer.cornerRadius = 50
        name.layer.borderColor = borderColor
        name.layer.borderWidth = 5
        name.backgroundColor = .blue
        name.contentMode = .scaleAspectFill
        
        
    }
    
    
    
    
    func designRandomPlayButtonAction() {
        //        randomPlayButton.setTitle("재생", for: .normal)   // 보통의 상태 (일반적인 상황에서 버튼을 어떻게 설정할지)
        //        randomPlayButton.setTitle("눌러주세요", for: .highlighted)   // 버튼을 꾹 누르고 손가락 떼지 않은 상태
        //        randomPlayButton.setTitleColor(.white, for: .normal)
        //        randomPlayButton.setTitleColor(.red, for: .highlighted)
                
        randomPlayButton.setImage(UIImage(named:"play_normal"), for: .normal)
        randomPlayButton.setImage(UIImage(named:"play_highlighted"), for: .highlighted)
        
        // 코드 길어지는게 보기 싫어서 따로 상수로 저장
        let normal = UIImage(named: "play_normal")
        randomPlayButton.setImage(normal, for: .normal)
        
        randomPlayButton.layer.cornerRadius = 10
        //randomPlayButton.layer.borderColor = UIColor.red.cgColor
        //randomPlayButton.layer.borderWidth = 4
    }
}

Netflix SignUp

//
//  JackFlixViewController.swift
//  0719hw
//
//  Created by 임승섭 on 2023/07/19.
//

import UIKit

class JackFlixViewController: UIViewController {
    
    // view 자체의 background color도 코드 내에서 설정하기 위해 Outlet으로 하나 땡겨왔다
    @IBOutlet var totalView: UIView!
    
		// 각 textfield를 모두 땡겨왔다
		// 원래 Outlet Collection으로 모아서 저장해볼까 생각했는데, 각각 placeholder를 쓰는 게 너무 어려울 것 같아서 포기했다
    @IBOutlet var titleLabel: UILabel!
    @IBOutlet var emailTextField: UITextField!
    @IBOutlet var passwordTextField: UITextField!
    @IBOutlet var nickNameTextField: UITextField!
    @IBOutlet var locationTextField: UITextField!
    @IBOutlet var recommendCodeTextField: UITextField!
    @IBOutlet var signUpButton: UIButton!
    
		// 추가 정보 레이블과 스위치
    @IBOutlet var additionalInfoLabel: UILabel!
    @IBOutlet var additionalInfoSwitch: UISwitch!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 배경 디자인
        totalView.backgroundColor = .black
        
        // 제목(JackFlix) 디자인
        titleLabel.text = "JACKFLIX"
        titleLabel.textColor = .red
        titleLabel.font = .boldSystemFont(ofSize: 30)
        titleLabel.textAlignment = .center
        
        // textfield 초기 디자인 (함수 이용)
        designTextField(emailTextField, message: "이메일 주소 또는 전화번호")
        designTextField(passwordTextField, message: "비밀번호")
        designTextField(nickNameTextField, message: "닉네임")
        designTextField(locationTextField, message: "위치")
        designTextField(recommendCodeTextField, message: "추천 코드 입력")
        
        // 회원가입 버튼 디자인
        signUpButton.layer.cornerRadius = 10
        signUpButton.setTitle("회원가입", for: .normal)
        signUpButton.setTitleColor(.black, for: .normal)
        signUpButton.setTitleColor(.black, for: .highlighted)
        signUpButton.backgroundColor = .white
				// bold체로 바꾸고, 글자 사이즈를 변경하는 법을 인호님이 알려주셨는데, 일단 수업 때 배운 setTitle을 이용했다
        //signUpButton.titleLabel?.font = .boldSystemFont(ofSize: 50)
        
        // 추가 정보 입력
        additionalInfoLabel.text = "추가 정보 입력"
        additionalInfoLabel.textColor = .white
        
        // 스위치
				// on 상태의 바탕색은 onTintColor로 쉽게 했는데, off일 때의 색이 문제였다
				// 그냥 단순히 backgroundColor를 white로 주면 배경이 사각형으로 뜬다
				// 그래서 cornerRadius를 16으로 해서, 거의 비슷하게 굴곡이 만들어지게 했다
        additionalInfoSwitch.onTintColor = .red
        additionalInfoSwitch.tintColor = .white
        additionalInfoSwitch.backgroundColor = .white
        additionalInfoSwitch.layer.cornerRadius = 16
        additionalInfoSwitch.isOn = true

    }
    
    
    // textfield 디자인하는 함수
    func designTextField(_ name: UITextField, message: String) {
        name.placeholder = message
        //name.attributedPlaceholder
        name.backgroundColor = .gray
        name.textColor = .white
        
        // 만약 비밀번호 입력 창이면 secure
        if (message == "비밀번호") {
            name.isSecureTextEntry = true
        }
    }
    
    // 회원가입 버튼 누르면 alert 창
    @IBAction func signUpButtonClicked(_ sender: UIButton) {
        // 1. 내용
        let content = "닉네임 : \(nickNameTextField.text!)"
        let alert = UIAlertController(title: "회원가입 완료", message: content, preferredStyle: .alert)
        
        // 2. 취소 / 확인
        let cancel = UIAlertAction(title: "취소", style: .cancel)
        let ok = UIAlertAction(title: "확인", style: .default)
        
        // 3. 연결
        alert.addAction(cancel)
        alert.addAction(ok)
        
        // 4. 띄우기
        present(alert, animated: true)
        
        
        
    }
    
    // tab gesture
    @IBAction func tapGesturedTapped(_ sender: UITapGestureRecognizer) {
        view.endEditing(true)
    }
}

Action Sheet

//
//  testViewController.swift
//  0719hw
//
//  Created by 임승섭 on 2023/07/20.
//

import UIKit

class testViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }
    

    @IBAction func alert(_ sender: UIButton) {
        
        // UIAlertController를 만들고, preferredStyle에
        // alert 또는 actionSheet을 적어서 구분한다
        
        // 보통 action sheet은 타이틀과 메세지를 넣지 않는다.
        // 1. 빈 문자열 -> 공간은 차지하고 있는다
        // 2. nil -> 공간조차 쓰지 않게 된다
        let alert = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
        
        let button1 = UIAlertAction(title: "11", style: .destructive)   // .destructive : 빨간색
        let button2 = UIAlertAction(title: "22", style: .cancel)    // .cancel : 취소
        // cancel이 두개면 어떻게 될까? -> 에러 발생
        
        let button3 = UIAlertAction(title: "333", style: .default)  //  .default : 파란색
        let button4 = UIAlertAction(title: "444", style: .default)
        
        
        // (순서 중요) 붙여주는 순서대로 버튼이 붙는다
        alert.addAction(button4)    // 맨 위에
        alert.addAction(button3)    // 그 밑에
        alert.addAction(button2)    // 얘는 cancel style이라 알아서 자기 자리 찾아간다
        alert.addAction(button1)    // 그 밑에
        
        
        // 원래 매개변수의 타입은 UIViewController이다.
        // UIAlertController가 걔를 상속받고 있기 때문에 매개변수로 사용 가능하다
        //present(<#T##viewControllerToPresent: UIViewController##UIViewController#>, animated: <#T##Bool#>)
        present(alert, animated: true)
        
        
        // action sheet는 뒷 배경 터치하면 팝업창이 내려가지만,
        // alert는 내려가지 않는다.
    }
}

Button Configuration

//
//  keyBoardViewController.swift
//  0719hw
//
//  Created by 임승섭 on 2023/07/20.
//

import UIKit

class keyBoardViewController: UIViewController {

    @IBOutlet var newButton: UIButton!
    

    override func viewDidLoad() {
        super.viewDidLoad()

        // 이전에 배운 코드
        // newButton.backgroundColor = .blue
        
        // iOS 15 이상부터 들어가는 기능
        // configuration - filled, gray,...
        var config = UIButton.Configuration.filled() // apple system button
        config.title = "새싹 영등포캠퍼스"
        config.subtitle = "로그인 없이 둘러보기"
        config.image = UIImage(systemName: "pencil")
        config.baseForegroundColor = .blue      // system 이미지 색도 바뀐다
        config.baseBackgroundColor = .yellow
        
        config.imagePadding = 9     // (title, subtitle)과 image 간의 패딩
        config.titlePadding = 4     // title과 subtitle 간의 패딩
        config.imagePlacement = .bottom
        config.titleAlignment = .leading
        
        config.background.cornerRadius = 0
        config.cornerStyle = .capsule
        // .capsule, .large, .medium, .small : cornerRadius 무시하고 시스템에 저장된 값 사용
        // .fixed, .dynamic : cornerRadius 반영
        newButton.configuration = config

    }
    
    // 두 버튼을 눌렀을 때 동일하게 키보드가 내려가게 하기
    @IBAction func keyboardDismiss(_ sender: Any) {
        view.endEditing(true)
        
        // 타입이 UIButton일 때,
        // sender.titleLabel 등 확인 가능. Any에서는 불가능
    }
    // 두 버튼 뿐만 아니라, 화면을 터치했을 때도 키보드가 내려가게 하고 싶다.
    // 기존처럼 tapgesture에 위 함수를 그대로 연결하면 깔끔하다
    // 하지만 만약 매개변수 타입을 UIButton으로 했으면, 연결이 불가능하다
    // 따라서 tapgesture와 연결하기 위해서는 타입을 Any로 바꿔주어야 한다
    
    // 하지만 단점으로, Any 타입일 때는 UIButton의 속성 (sender.titleLabel, ...)에 접근할 수 없다
    
    // Any : 객체가 다르더라고 같은 기능을 넣고 싶을 때 사용한다
}

D-day Counter

//
//  AnniversaryViewController.swift
//  0720hw
//
//  Created by 임승섭 on 2023/07/20.
//

import UIKit

class AnniversaryViewController: UIViewController {

    // 4개의 이미지 뷰를 배열로 저장
    @IBOutlet var backgroundImageViews: [UIImageView]!
    
    // 그림자를 위한 4개의 뷰를 배열로 저장
    @IBOutlet var forShadowViews: [UIView]!
    
    // 4개의 이미지 asset 이름
    let assetNames = ["churros", "cake", "icecream", "doughnut"]
    
    // 4개의 디데이 배열 (
    let dDay = [100, 200, 300, 400]
    // 디데이 레이블
    @IBOutlet var dDayLabels: [UILabel]!
    // 4개의 디데이 날짜 레이블
    @IBOutlet var dDayDateLabels: [UILabel]!
    
    // datepicker
    @IBOutlet var goodDatePicker: UIDatePicker!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // DateFormatter 만들기 0000년 0월 00일
        let format = DateFormatter()
        format.dateFormat = "yyyy년 M월 dd일"
        
        // 4개의 칸 디자인
        for i in 0...3 {
            // 이미지 뷰와 그림자 뷰
            designImageView(backgroundImageViews[i], assetName: assetNames[i])
            designShadowView(forShadowViews[i])
            
            // 디데이 레이블
            dDayLabels[i].text = "D + \(dDay[i])"
            dDayLabels[i].textColor = .white
            dDayLabels[i].font = .boldSystemFont(ofSize: 25)
            
            // 디데이 날짜 레이블
            // 화면이 켜지자마자 출력해야 한다
            // 1. 내 생각 : 오늘 날짜 기준으로 계산해서 출력한다
            // 2. 과제설명 : datePicker에 선택된 날짜 기준으로 계산해서 출력한다
            
            /* 1
            let result = Calendar.current.date(byAdding: .day, value: dDay[i], to: Date())
            
            dDayDateLabels[i].text = format.string(from: result!)
            dDayDateLabels[i].textColor = .white
            dDayDateLabels[i].textAlignment = .center
             */
            
        }
        // 2
        datePickerValueChanged(goodDatePicker)
        
    }
    
    
    @IBAction func datePickerValueChanged(_ sender: UIDatePicker) {
        
        // DateFormatter 만들기 0000년 0월 00일
        let format = DateFormatter()
        format.dateFormat = "yyyy년 M월 dd일"
        
        // 각 칸의 디데이에 맞춰서 날짜 출력
        for i in 0...3 {
            let result = Calendar.current.date(byAdding: .day, value: dDay[i], to: sender.date)
            
            dDayDateLabels[i].text = format.string(from: result!)
            dDayDateLabels[i].textColor = .white
            dDayDateLabels[i].textAlignment = .center
        }
    }
    
    
    // 이미지 뷰 디자인 함수
    func designImageView(_ name: UIImageView, assetName: String) {
        name.image = UIImage(named: assetName)
        
        name.contentMode = .scaleAspectFill
        name.layer.cornerRadius = 20
//        name.layer.shadowColor = UIColor.black.cgColor
//        name.layer.shadowOffset = CGSize(width: 10, height: 10)
//        name.layer.shadowRadius = 10
//        name.layer.shadowOpacity = 0.5
        name.clipsToBounds = true
        
        // cornerRadius와 shadow를 동시에 줄 수 없다 <- clipsToBound에서 걸린다
        // 방법 1.
        // 다른 뷰를 겹쳐서 해당 뷰에 그림자를 준다
        // 이미지가 보여야 하기 때문에 새로운 뷰를 이미지 뷰보다 아래에 위치시킨다
        // 근데, 뷰를 같은 사이즈로 하니까 테두리 곡선에 삐져나와서, 이미지 뷰보다 사이즈를 줄여서 넣어주었다
    }
    
    // 그림자 뷰 디자인 함수
    func designShadowView(_ name: UIView) {
        
        name.clipsToBounds = false
        name.layer.shadowColor = UIColor.black.cgColor
        name.layer.shadowOffset = CGSize(width: 15, height: 15)
        name.layer.shadowRadius = 20
        name.layer.shadowOpacity = 0.8
        name.layer.shadowPath = UIBezierPath(roundedRect: name.bounds, cornerRadius: 20).cgPath
    }
    
}

Newly Coined Word Search

//
//  WordSearchViewController.swift
//  0721hw
//
//  Created by 임승섭 on 2023/07/21.
//

import UIKit

class WordSearchViewController: UIViewController {

    // 신조어와 뜻을 dictionary로 저장
    var wordDict = [
        "뉴진스" : "새 청바지",
        "알잘딱깔센" : "알아서 잘 딱 깔끔하게 센스있게",
        "별다줄" :"별걸 다 줄인다",
        "억텐" : "억지 텐션의 줄임말. 억지로 텐션을 올려서 발랄하게 행동할 때",
        "스불재" : "스스로 불러온 배앙의 줄임말. 자신이 계획한 일로 자신이 고통을 받을 때 씀",
        "좋댓구알" : "좋아요, 댓글, 구독, 알림 설정",
        "어쩔티비" : "어쩌라고 가서 티비나 봐",
        "갓생" : "갓(God) + 생. 부지런하고 열심히 사는 사람에게 쓰는 말",
        "점메추" : "점심 메뉴 추천"
    ]
    
    
    // 아웃렛
    @IBOutlet var searchTextField: UITextField!
    @IBOutlet var searchButton: UIButton!
    
    @IBOutlet var tagButton1: UIButton!
    @IBOutlet var tagButton2: UIButton!
    @IBOutlet var tagButton3: UIButton!
    @IBOutlet var tagButton4: UIButton!
    
    @IBOutlet var meaningLabel: UILabel!
    @IBOutlet var backgroundImage: UIImageView!
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 디자인
        designSearchTextField(searchTextField)
        designTagButton(tagButton1, "뉴진스")
        designTagButton(tagButton2, "알잘딱깔센")
        designTagButton(tagButton3, "별다줄")
        designTagButton(tagButton4, "억텐")
        designSearchButton(searchButton)
        designMeaningLabel(meaningLabel)
        
        // 아무것도 검색하지 않았을 때 이미지
        backgroundImage.image = UIImage(named: "word_logo")
        backgroundImage.contentMode = .scaleAspectFill
    }

    /*======= 디자인 함수 =======*/
    // search textfield 디자인
    func designSearchTextField(_ field: UITextField) {
        field.placeholder = "신조어를 입력하세요"
        field.layer.borderColor = UIColor.black.cgColor
        field.layer.borderWidth = 2
    }
    
    // search button 디자인
    func designSearchButton(_ button: UIButton) {
        
        // 1. configuration 방법
//        var config = UIButton.Configuration.filled()
//        config.image = UIImage(systemName: "pencil")
//        config.baseBackgroundColor = .black
//        config.baseForegroundColor = .white
//        button.configuration = config
        // 문제 : 모서리가 둥글게 됨
        // 해결 : config.background.cornerRadius = 0 써주면 되더라
        
        // 2. 그냥 정통 방법
        button.setImage(UIImage(systemName: "pencil"), for: .normal)
        button.tintColor = .white
        button.backgroundColor = .black
        button.layer.borderColor = UIColor.black.cgColor
        button.layer.borderWidth = 2
        button.setTitle(nil, for: .normal)
        
    }
    
    // tag button 디자인
    func designTagButton(_ button: UIButton, _ name: String) {
        
        // 오토레이아웃으로 서로 여백만 주었는데도 String 길이에 따라 버튼의 사이즈가 자동으로 조절된다
        
        button.layer.cornerRadius = 10
        button.layer.borderColor = UIColor.black.cgColor
        button.layer.borderWidth = 1
        button.setTitle(name, for: .normal)
        button.setTitleColor(.black, for: .normal)
    }
    
    // meaning label 디자인
    func designMeaningLabel(_ label: UILabel) {
        label.textAlignment = .center
        label.numberOfLines = 0
    }
    
    
    
    /*======= 기능 함수 =======*/
    // 현재 textfield에 있는 단어를 검색해서 화면에 나타나게 하는 함수
    // 키보드의 엔터 키를 누르거나 search Button을 눌렀을 때 실행되게 한다
    func showMeaning() {
        // 0. image 변경
        backgroundImage.image = UIImage(named: "background")
        
        
        // 1. textfield에 있는 걸 읽어옴
        let txt = searchTextField.text!
        
        // 2. 딕셔너리에서 찾는다
        let meaning = wordDict[txt]
        
        // 3-1. 딕셔너리에 있으면, 화면에 뜻 출력
        if meaning != nil {
            meaningLabel.text = meaning
        }
        
        // 3-2. 딕셔너리에 없으면, alert 후 기본 이미지로 초기화
        else {
            let alert = UIAlertController(title: "없는 단어입니다", message: "다시 입력해주세요", preferredStyle: .alert)
            
            // 2. 취소 / 확인
            let cancel = UIAlertAction(title: "취소", style: .cancel)
            let ok = UIAlertAction(title: "확인", style: .default)
            
            // 3. 연결
            alert.addAction(cancel)
            alert.addAction(ok)
            
            // 4. 띄우기
            present(alert, animated: true)
            
            // 기본 이미지로 변경
            backgroundImage.image = UIImage(named: "word_logo")
            meaningLabel.text = ""
        }
        
    }
    
    
    
    /*======= @IBAction =======*/
    // 키보드에서 return 키를 누른다
    @IBAction func keyboardReturnTapped(_ sender: UITextField) {
        showMeaning()
    }
    
    // search button 클릭
    @IBAction func searchButtonTapped(_ sender: UIButton) {
        showMeaning()
    }
    
    // tap gesture - 키보드 내려가게
    @IBAction func tapgestrue(_ sender: UITapGestureRecognizer) {
        view.endEditing(true)
    }
    
    // tag button 클릭
    @IBAction func wordButtonTapped(_ sender: UIButton) {
        
        // 1. textfield에 적히게
        searchTextField.text = sender.currentTitle
        
        // 2. 그대로 검색 (showMeaning)
        showMeaning()
        
    }
    
    
    
    
    /*
     궁금한 점
     textfield.text로 받는 값은 옵셔널
     근데 textfield에 아무것도 입력하지 않았을 때는 Optional("") 로
     빈 문자열이 나온다
     그럼 nil이 나오는 경우는 언제일까
     */
}

1개의 댓글

comment-user-thumbnail
2023년 7월 22일

개발자로서 성장하는 데 큰 도움이 된 글이었습니다. 감사합니다.

답글 달기