꾸준히 안타치기

세그(Segue) / 화면전환 본문

iOS/storyboard & code

세그(Segue) / 화면전환

글자줍기 2021. 12. 23. 15:04
반응형

se·gue|séɡwei|명사이탈리아어1.음악세구에: 한 악장·악부(樂部)에서 사이를 두지 않고 계속하는 일.2.앞의프로그램과 끊어지지 않고 계속되는 프로그램.동사, 자동사1.음악 바로 뒤의 악장·악부 계속하다, 계속해서 연주하다. 2.단절 없이 계속되다. 3.…에서; …으로 변신하다 from ; to .

 

세그는 IOS에서 여러화면을 사용할 경우, 화면 전환을 위해 사용된다.

 

UIStoryboardSegue 클래스

UIStoryboardSegue 클래스는 UIKit에서 사용할 수 있는 표준 화면전환을 위한 프로퍼티와 메서드를 포함하고 있습니다.

또 커스텀 전환을 정의하기 위해 서브클래스를 구현해서 사용할 수도 있습니다. 필요에 따라서 UIViewController의 performSegue(withIdentifier:sender:)메서드를 사용하여 세그 객체를 코드로 실행할 수 있습니다.

세그(Segue) 객체는 뷰 컨트롤러의 뷰 전환과 관련된 정보를 가지고 있습니다. 세그는 뷰 컨트롤러의 뷰를 다른 뷰 컨트롤러의 뷰로 전환할 때 뷰 컨트롤러의 prepare(for:sender:) 메서드를 사용하여 새로 보여지는 뷰 컨트롤러에 데이터를 전달할 수 있습니다.

 

주요 프로퍼티

  • var source: UIViewController : 세그에 전환을 요청하는 뷰 컨트롤러입니다.
  • var destination: UIViewController : 전환될 뷰 컨트롤러입니다.
  • var identifier: String? : 세그 객체의 식별자입니다.

https://www.boostcourse.org/mo326/lecture/16893?isDesc=false 

 

iOS 앱 프로그래밍

부스트코스 무료 강의

www.boostcourse.org

 

TableViewController.swift의 리스트 아이템을 눌러 다음화면으로 전달.

    // 리스트 아이템을 클릭했을때 데이터를 넘겨주는 코드
    // MARK: - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
        
        // 눌러어서 넘어가는 ViewController의 이름이 DetailViewController이다.
        guard let nextViewController: DetailViewController =
                segue.destination as? DetailViewController else{
            return
        }
        
        guard let cell: UITableViewCell = sender as? UITableViewCell else{
            return
        }
        // 다음 뷰컨트롤러로 셀에 담겨있는 데이터를 textToset에 담아서 전달한다.
        nextViewController.textToSet = cell.textLabel?.text
    }

전체소스

더보기
더보기
import UIKit


class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource{
    
    @IBOutlet weak var tableView: UITableView!
    let cellIdentifier: String = "cell"
    // 커스텀셀 설정
    let customCellIdentifier:String="customCell"
    
    let korean: [String] = ["가","나","다","라","마","바","가","나","다","라","마","바"]
    let english: [String] = ["A","B","C","D","E","F","A","B","C","D","E","F"]
    var dates: [Date] = []
    
    
    // 데이트피커 설정
    let dateFormatter: DateFormatter = {
        let formatter: DateFormatter = DateFormatter()
        formatter.dateStyle = .short
        return formatter
    }()
    
    // 타임포매터 설정
        let timeFormatter: DateFormatter = {
        let formatter: DateFormatter = DateFormatter()
        formatter.timeStyle = .short
        return formatter
    }()
    
    // 버튼을 누를때 마다 테이블 뷰를 업데이트 한다.
    @IBAction func touchUPAddButton(_ sender: UIButton){
        dates.append(Date())
        
        // 전체데이터를 다가져오는 함수
//        self.tableView.reloadData()
        
        // 새로추가된 것만 가져오는 함수 + 애니메이션
        self.tableView.reloadSections(IndexSet(2...2), with:
                                        UITableView.RowAnimation.automatic)
    }
    
    
    override func viewDidLoad(){
        super.viewDidLoad()
        
        self.tableView.delegate = self
        self.tableView.dataSource = self
     }
    
    // 섹션을 몇개를 보여줄지?
    func numberOfSections(in tableView: UITableView) -> Int {
        return 3
    }
    
    // 섹션마다 무엇을 보여줄지?
    func tableView(_ tableView: UITableView, numberOfRowsInSection section:
      Int)->Int{
        
        switch section{
        case 0:
            return korean.count
        case 1:
            return english.count
        case 2:
            return dates.count
        default:
            return 0
        }
    }
    
    // 줄에 해당하는 셀보여주기 // 셀을 돌려주는 곳
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath:
                    IndexPath)-> UITableViewCell{
        
        
        if indexPath.section < 2 {
            
            let cell : UITableViewCell =
                tableView.dequeueReusableCell(withIdentifier:self.cellIdentifier,for: indexPath)
            
            let text: String = indexPath.section == 0 ? korean[indexPath.row] :
                english[indexPath.row]
            cell.textLabel?.text = text
            
            // 셀컬러 변경하기 (1번째 행만 레드이고, 나머지는 흰색으로 설정해라.)// 셀의 재사용
            if indexPath.row == 1{
                cell.backgroundColor = UIColor.red
            }else{
                cell.backgroundColor = UIColor.white
            }
        
            
            return cell
            
            // 3번째 추가하는 커스텀 셀 ( as! CustomTableViewCell 강제캐스팅 )
        }else{
            
            let cell: CustomTableViewCell =
                tableView.dequeueReusableCell(withIdentifier: self.customCellIdentifier, for: indexPath) as!
                CustomTableViewCell
            
            cell.leftLabel.text = self.dateFormatter.string(from: self.dates[indexPath.row])
            
            cell.rightLabel.text = self.timeFormatter.string(from: self.dates[indexPath.row])
            
            return cell
        }
    }
    
    func tableView(_ tableView: UITableView, titleForHeaderInSection section:
                    Int) -> String?{
        if section < 2 {
            return section == 0 ? "한글" : "영어"
        }
        return nil
    }
    
    
    // 리스트 아이템을 클릭했을때 데이터를 넘겨주는 코드
    // MARK: - Navigation
    
    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destination.
        // Pass the selected object to the new view controller.
        
        guard let nextViewController: DetailViewController =
                segue.destination as? DetailViewController else{
            return
        }
        
        guard let cell: UITableViewCell = sender as? UITableViewCell else{
            return
        }
        
        nextViewController.textToSet = cell.textLabel?.text
    }
}

 

데이터를 받아서 보여주는 DetailViewController.swift

import UIKit

class DetailViewController: UIViewController {
    
    //  프로퍼티 생성
    var textToSet: String?
    // 눌러서 넘겨준 텍스트
    @IBOutlet weak var textLabel: UILabel!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        // Do any additional setup after loading the view.
    }
    
    // 화면이 보이기 직전에 textToset에 들어갈 데이터를 받아온다.
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
         
        self.textLabel.text = self.textToSet
    }

}

 

반응형
Comments