꾸준히 안타치기

알림창 / Slider , 테이블목록 넣기 본문

iOS/기본편 | 실전편 -꼼꼼한재은씨

알림창 / Slider , 테이블목록 넣기

글자줍기 2022. 2. 2. 17:07
반응형

   Slider Alert누르면 -> 팝업생성(값받아와서 콘솔출력)

MapAlertViewController

import UIKit
import MapKit

class MapAlertViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 슬라이더 알림창 버튼 생성
        let sliderBtn = UIButton(type: .system)
        
        sliderBtn.frame = CGRect(x: 0, y: 250, width: 100, height: 30)
        sliderBtn.center.x = self.view.frame.width / 2
        sliderBtn.setTitle("Slider Alert", for: .normal)
        sliderBtn.addTarget(self, action: #selector(sliderAlert(_:)), for: .touchUpInside)
        
        self.view.addSubview(sliderBtn)
    }
    
    @objc func sliderAlert(_ sender: Any) {
        // 콘텐츠 뷰 영역에 들어갈 뷰 컨트롤러를 생성
        let contentVC = ControlViewController()
        
        // 경고창 객체를 생성
        let alert = UIAlertController(title:nil,
                                      message: "이번 글의 평점을 입력해주세요.",
                                      preferredStyle: .alert)
        
        // 컨트롤 뷰 컨트롤러를 알림창에 등록한다.
        alert.setValue(contentVC, forKeyPath: "contentViewController")
        
        // OK 버튼을 추가한다.// 사용한슬라이더의 값을 연산프로퍼티를 통해 읽어와 출력한다.
        let okAction = UIAlertAction(title: "OK", style: .default) { (_) in
            print(">>> sliderValue = \(contentVC.sliderValue)")
        }
        alert.addAction(okAction)
        self.present(alert, animated: false)
    }
}

알림창의 OK버튼을 누르면 슬라이더의 값을 읽어와 print한다.

 

ControlViewController

뷰컨트롤러와 알림창슬라이더가 있는 뷰컨트롤러가 다르다. 양쪽 뷰 컨트롤러의 슬라이더 값을 주고 받을 수 있도록

슬라이더가 구현된 뷰컨쪽에 슬라이더의 값을 읽어오는 연산프로퍼티를 정의한 다음 이것을 외부 클래스에서 값을 참조한다.

import UIKit
class ControlViewController: UIViewController {
    // 슬라이더 객체를 정의한다.
    private let slider = UISlider()
    
    // 슬라이더 객체의 값을 읽어올 연산 프로퍼티 (슬라이더의 값을 받아서 사용하기위함)
    var sliderValue: Float {
        return self.slider.value
    }
    
    override func viewDidLoad() {
        // 슬라이더의 최소값 / 최대값 설정
        self.slider.minimumValue = 0
        self.slider.maximumValue = 100
        
        // 슬라이더의 영역과 크기를 정의하고 루트 뷰에 추가한다.
        self.slider.frame = CGRect(x: 0, y: 0, width: 170, height: 30)
        self.view.addSubview(self.slider)
        
        // 뷰 컨트롤러의 콘텐츠 사이즈를 지정한다.
        self.preferredContentSize = CGSize(width: self.slider.frame.width, height: self.slider.frame.height+10)
    }
}

sliderValue는 슬라이더 객체값을 읽어 반환하는 역할로 정의된 연산프로퍼티이다.

제한적으로 필요한 부분만 제공할 수있도록 연산프로퍼티를 사용한다.

일반적으로 뷰컨트롤러에 추가된 객체는 외부에서 참조할수없도록 처리하는 것이 좋다. 객체를 외부에서 처리하면 임의로 값을 변경할거나 설정을 마음대로 바꿔버릴수 있기 때문이다.


알림창에 테이블목록 넣기                   

ListViewController

사용자가 목록을 선택하면 MapAlertViewController에 알려주어야 하는데, 공식적으로 참조할수 있는 방법이 없다.

필요할때 호출할 수 있도록 객체 참조 정보를 이 변수에 저장해 놓아야한다.

import UIKit

// 테이블뷰 내용
class ListViewController: UITableViewController {
    
    // 1.델리게이트 설정하기 ************************************
    var delegate: MapAlertViewController?
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        self.preferredContentSize.height = 220 // 테이블이 길어져도 고정높이로 설정
    }
    
    // 2.행을 선택시 알려주기 위해서 델리게이트 설정을 해준다.**********************
    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        self.delegate?.didSelectRowAt(indexPath: indexPath)
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    
    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = UITableViewCell()
        cell.textLabel!.text = "\(indexPath.row)번째 옵션입니다."
        cell.textLabel!.font = UIFont.systemFont(ofSize: 13)
        
        return cell
    }
}

MapAlertViewController 얼럿창 띄우는 뷰컨트롤러 

 

import UIKit
import MapKit

class MapAlertViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // 버튼 생성
        let listBtn = UIButton(type: .system)
        
        listBtn.frame = CGRect(x: 0, y: 250, width: 100, height: 30)
        listBtn.center.x = self.view.frame.width / 2
        listBtn.setTitle("Slider Alert", for: .normal)
        listBtn.addTarget(self, action: #selector(listAlert(_:)), for: .touchUpInside)
        
        self.view.addSubview(listBtn)
    }
    
    // 4.행 선택시 값표기하기**********************************
    func didSelectRowAt(indexPath: IndexPath){
        print("선택된 행은 \(indexPath.row)입니다.")
    }
    
    @objc func listAlert(_ sender: Any) {
        // 버튼을 눌렀을때
        // 콘텐츠 뷰 영역에 들어갈 뷰 컨트롤러를 생성 //ListViewController가져와서 끼워넣기
        let contentVC = ListViewController()
        
        // 3.델리게이트 객체를 자신으로 지정한다.************************
        contentVC.delegate = self
        
        // 경고창 객체를 생성
        let alert = UIAlertController(title:nil,
                                      message: nil,
                                      preferredStyle: .alert)
        
        // 컨트롤 뷰 컨트롤러를 알림창에 등록한다.
        alert.setValue(contentVC, forKeyPath: "contentViewController")
        
        // OK 버튼을 추가한다.// 사용한슬라이더의 값을 연산프로퍼티를 통해 읽어와 출력한다.
        let okAction = UIAlertAction(title: "OK", style: .default) { (_) in
//            print(">>> sliderValue = \(contentVC.sliderValue)")
        }
        
        let cancelAction = UIAlertAction(title: "cancel", style: .default) { (_) in
//            print(">>> sliderValue = \(contentVC.sliderValue)")
        }
        alert.addAction(okAction)
        alert.addAction(cancelAction)
        
        self.present(alert, animated: false)
    }
}

 

반응형
Comments