swift tabbar controller tableview 영화목록 영화관 스위프트 테이블뷰 탭바 컨트롤러



//

//  MovieCell.swift

//  MyMovieChart

//

//  Created by stayfoolish on 29/10/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class MovieCell: UITableViewCell {

    

    @IBOutlet var title: UILabel!

    @IBOutlet var desc: UILabel!

    @IBOutlet var opendate: UILabel!

    @IBOutlet var rating: UILabel!

    @IBOutlet var thumbnail: UIImageView!

    

}


//

//  MovieVO.swift

//  MyMovieChart

//

//  Created by stayfoolish on 28/10/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import Foundation

import UIKit


class MovieVO {

    var thumbnail: String? // 영화 섬네일 이미지 주소

    var title: String? // 영화 제목

    var description: String? // 영화 설명

    var detail: String? // 상세정보

    var opendate: String? // 개봉일

    var rating: Double? // 평점

    

    // 영호 썸네일 이미지를 담을 UIImage 객체를 추가한다.

    var thumbnailImage: UIImage?

}


//

//  ListViewController.swift

//  MyMovieChart

//

//  Created by stayfoolish on 28/10/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ListViewController: UITableViewController {

    

    @IBOutlet var moreBtn: UIButton!

    

    /*

    // 튜플 아이템으로 구성된 데이터 세트

    var dataset = [

        ("다크 나이트","영웅물에 철학에 음악까지 더해져 예술이 되다.","2008-09-04",8.95,"darknight.jpg"),

        ("호우시절","때를 알고 내리는 좋은 비","2009-10-08",7.31,"rain.jpg"),

        ("말할 수 없는 비밀","여기서 너까지 다섯 걸음","2015-05-07",9.19,"secret.jpg")

    ]

    */

    

    // 현재까지 읽어온 데이터의 페이지 정보

    var page = 1

    

    // 테이블 뷰를 구성할 리스트 데이터

    lazy var list: [MovieVO] = {

        var datalist = [MovieVO]()

       /*

        for (title, desc, opendate, rating, thumbnail) in self.dataset {

            let mvo = MovieVO()

            mvo.title = title

            mvo.description = desc

            mvo.opendate = opendate

            mvo.rating = rating

            mvo.thumbnail = thumbnail

            

            datalist.append(mvo)

        }

       */

        return datalist

    }()



    @IBAction func more(_ sender: UIButton) {

    // 0) 현재 페이지 값에 1을 추가한다.

    self.page += 1

    

    // 영화차트 API를 호출한다.

    self.callMovieAPI()

        

        

    // 데이터를 다시 읽어오도록 테이블 뷰를 갱신한다.

    self.tableView.reloadData()

    }

    

    

    // 뷰가 처음 메모리에 로드될 때 호출되는 메소드

    override func viewDidLoad() {

        // 영화차트 API를 호출한다.

        self.callMovieAPI()


    }

    

    func callMovieAPI() {

        // 1) 호핀 API를 호출을 위한 URI를 생성

//        let url = "http://swiftapi.rubypaper.co.kr:2029/hoppin/movies?version=1&page=\(self.page)&count=10&genreId=&order=releasedateasc"

        let url = "http://swiftapi.rubypaper.co.kr:2029/hoppin/movies?version=1&page=\(self.page)&count=30&genreId=&order=releasedateasc"

        

        let apiURL: URL! = URL(string: url)

        

        // 2) REST API를 호출

        let apidata = try! Data(contentsOf: apiURL)

        

        // 3) 데이터 전송 결과를 로그로 출력 (반드시 필요한 코드는 아님)

        let log = NSString(data: apidata, encoding: String.Encoding.utf8.rawValue) ?? "데이터가 없습니다"

        NSLog("API Result=\( log )")

        

        // 4) JSON 객체를 파싱하여 NSDictionary 객체로 받음

        do {

            let apiDictionary = try JSONSerialization.jsonObject(with: apidata, options: []) as! NSDictionary

            

            // 5) 데이터 구조에 따라 차례대로 캐스팅하며 읽어온다.

            let hoppin = apiDictionary["hoppin"] as! NSDictionary

            let movies = hoppin["movies"] as! NSDictionary

            let movie = movies["movie"] as! NSArray

            

            // 6) Iterator 처리를 하면서 API 데이터 MovieVO 객체에 저장한다.

            for row in movie {

                // 순회 상수를 NSDictionary 타입으로 캐스팅

                let r = row as! NSDictionary

                

                // 테이블 뷰 리스트를 구성할 데이터 형식

                let mvo = MovieVO()

                

                // movie 배열의 각 데이터를 mvo 상수의 속성에 대입

                mvo.title = r["title"] as? String

                mvo.description = r["genreNames"] as? String

                mvo.thumbnail = r["thumbnailImage"] as? String

                mvo.detail = r["linkUrl"] as? String

                mvo.rating = ((r["ratingAverage"] as! NSString).doubleValue)

                

                // 웹상에 있는 이미지를 읽어와 UIImage 객체로 설정

                let url: URL! = URL(string: mvo.thumbnail!)

                let imageData = try! Data(contentsOf: url)

                mvo.thumbnailImage = UIImage(data:imageData)

                

                

                // list 배열에 추가

                self.list.append(mvo)

                

                // 7) 전체 데이터 카우트를 얻는다.

                let totalCount = (hoppin["totalCount"] as? NSString)!.integerValue

                

                // 8) totalCount가 읽어온 데이터 크기와 같거나 클 경우 더보기 버튼을 막는다.

                if (self.list.count >= totalCount){

                    self.moreBtn.isHidden = true

                }

            }

        }catch { NSLog("Parse Error!!")}

    }

    

    func getThumnailImage(_ index: Int) -> UIImage {

        // 인자값으로 받은 인덱스를 기반으로 해당하는 배열 데이터를 읽어옴

        let mvo = self.list[index]

        

        // 메모이제이션 : 저장된 이미지가 있으면 그것을 반환하고, 없을 경우 내려받아 저장한 후 반환

        if let savedImage = mvo.thumbnailImage {

            return savedImage

        }else {

            let url: URL! = URL(string: mvo.thumbnail!)

            let imageData = try! Data(contentsOf: url)

            mvo.thumbnailImage = UIImage(data:imageData) // UIImage를 MovieVO 객체에 우선 저장

            

            return mvo.thumbnailImage! // 저장된 이미지를 반환

        }

        

        

    }


    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

            return self.list.count

    }

    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // 주어진 행에 맞는 데이터 소스를 읽어온다.

        let row = self.list[indexPath.row]

        

        // 로그 출력

        NSLog("제목:\(row.title!), 호출된 행번호:\(indexPath.row)")

        

        // 테이블 셀 객체를 직접 생성하는 대신 큐로부터 가져옴

        // as! UITableViewCell => as! MovieCell 로 캐스팅 타입 변경

        let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell") as! MovieCell

        

        // 데이터 소스에 저장된 값을 각 아울렛 변수에 할당

        cell.title?.text = row.title

        cell.desc?.text = row.description

        cell.opendate?.text = row.opendate

        cell.rating?.text = "\(row.rating!)"


        /*

        // 섬네일 경로를 인자값으로 하는 URL 객체를 생성

        let url: URL! = URL(string: row.thumbnail!)

        

        // 이미지를 읽어와 Data 객체에 저장

        let imageData = try! Data(contentsOf: url)

        

        // UIImage 객체를 생성하여 아울렛 변수의 image 속성에 대입

        cell.thumbnail.image = UIImage(data: imageData)

        */

        

        /*

        // 이미지 객체를 대입힌다.

        cell.thumbnail.image = row.thumbnailImage

        */

        

        // 비동기 방식으로 섬네일 이미지를 읽어옴

        DispatchQueue.main.async(execute: {

            NSLog("비동기 방식으로 실행되는 부분입니다")

            cell.thumbnail.image = self.getThumnailImage(indexPath.row)

        })

 

        NSLog("메소드 실행을 종료하고 셀을 리턴합니다.")

        // 셀 객체를 반환

        return cell

    }

    

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        NSLog("선택된 행은 \(indexPath.row) 번째 행입니다.")

    }

}


//

//  TheaterCell.swift

//  MyMovieChart

//

//  Created by stayfoolish on 27/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class TheaterCell: UITableViewCell {


    

    @IBOutlet var name: UILabel! // 상영관명

    @IBOutlet var tel: UILabel! // 연락처

    @IBOutlet var addr: UILabel! // 주소

    

    

    override func awakeFromNib() {

        super.awakeFromNib()

        // Initialization code

    }


    override func setSelected(_ selected: Bool, animated: Bool) {

        super.setSelected(selected, animated: animated)


        // Configure the view for the selected state

    }


}


//

//  TheaterListController.swift

//  MyMovieChart

//

//  Created by stayfoolish on 27/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class TheaterListController: UITableViewController {


    // API를 통해 불러온 데이터를 저장할 배열 변수

    var list = [NSDictionary]()

    

    // 읽어올 데이터의 시작위치

    var startPoint = 0

    

    override func viewDidLoad() {

        super.viewDidLoad()

        self.callTheaterAPI()

    }

    

    func callTheaterAPI(){

        // URL을 구성하기 위한 상수값을 선언한다.

        let requestURI = "http://swiftapi.rubypaper.co.kr:2029/theater/list" // API 요청 주소

        

        let sList = 100 // 불러올 데이터 갯수

        let type = "json" // 데이터 형식

        

        // 인자값을 모아 URL 객체로 정의한다.

        let urlObj = URL(string: "\(requestURI)?s_page=\(self.startPoint)&s_list=\(sList)&type=\(type)")

        

        do {

            // NSString 객체를 이용하여 API를 호출하고 그 결과값을 인코딩된 문자열로 받아온다.

            let stringdata = try NSString(contentsOf: urlObj!, encoding: 0x80_000_422)

            

            // 문자열로 받은 데이터를 UTF-8로 인코딩 처리한 Data로 변환한다.

            let encdata = stringdata.data(using: String.Encoding.utf8.rawValue)

            do {

                // Data 객체를 파싱하여 NSArray 객체로 변환한다.

                let apiArray = try JSONSerialization.jsonObject(with: encdata!, options: []) as? NSArray

                

                // 읽어온 데이터를 순회하면서 self.list 배열에 추가한다.

                for obj in apiArray! {

                    self.list.append(obj as! NSDictionary)

                }

            }catch {

                // 경고창 형식으로 오류 메세지를 표시해준다.

                let alert = UIAlertController(title: "실패", message: "데이터 분석이 실패하였습니다.", preferredStyle: .alert)

                alert.addAction(UIAlertAction(title: "확인", style: .cancel))

                self.present(alert, animated: false)

            }

            // 읽어와야 할 다음 페이지의 데이터 시작 위치를 구해 저장해둔다.

            self.startPoint += sList

        }catch {

            // 경고창 형식으로 오류 메세지를 표시해준다.

            let alert = UIAlertController(title: "실패", message: "데이터를 불러오는데 실패하였습니다.", preferredStyle: .alert)

            

            alert.addAction(UIAlertAction(title: "확인", style: .cancel ))

            self.present(alert, animated: false)

        }

    }


    // MARK: - Table view data source




    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        // #warning Incomplete implementation, return the number of rows

        return self.list.count

    }


    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // self.list 배열에서 행에 맞는 데이터를 꺼냄

        let obj = self.list[indexPath.row]

        

        // 재사용 큐로부터 tCell 식별자를 맞는 셀 객체를 전달받음

        let cell = tableView.dequeueReusableCell(withIdentifier: "tCell", for: indexPath) as! TheaterCell

        

        cell.name?.text = obj["상영관명"] as? String

        cell.tel?.text = obj["연락처"] as? String

        cell.addr?.text = obj["소재지도로명주소"] as? String

        

        return cell

    }

    


    /*

    // Override to support conditional editing of the table view.

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        // Return false if you do not want the specified item to be editable.

        return true

    }

    */


    /*

    // Override to support editing the table view.

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            // Delete the row from the data source

            tableView.deleteRows(at: [indexPath], with: .fade)

        } else if editingStyle == .insert {

            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view

        }    

    }

    */


    /*

    // Override to support rearranging the table view.

    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {


    }

    */


    /*

    // Override to support conditional rearranging of the table view.

    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {

        // Return false if you do not want the item to be re-orderable.

        return true

    }

    */


    /*

    // 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.

    }

    */


}








swift submitvalue back userdefaults 스위프트 이전 화면 유저디폴트 데이터 전달




코코아 터치 프레임워크에서 제공하는 UserDefaults 객체를 통해 값을 주고 받는 방법.


앱을 삭제하기 전까지는 저장된 값이 반영구적으로 유지된다는 장점이 있습니다.


비교적 단순하면서도 값이 유지되어야 하는 로그인 여부나 간단한 설정 정보 등을 저장하는 경우가 많습니다.



//

//  ViewController.swift

//  SubmitValueBack

//

//  Created by stayfoolish on 24/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController {

    

    // 값을 화면에 표시하기 위한 아울렛 변수들

    @IBOutlet var resultEmail: UILabel!

    @IBOutlet var resultUpdate: UILabel!

    @IBOutlet var resultInterval: UILabel!

    

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    // 화면에 표시될 때마다 실행되는 메소드

    override func viewWillAppear(_ animated: Bool) {

        // UserDefault 객체의 인스턴스를 가져온다.

        let ud = UserDefaults.standard

        

        

        if let email = ud.string(forKey: "email") {

            // 이메일 표시

            resultEmail.text = email

        }

        let update = ud.bool(forKey: "isUpdate")

            // 자동 갱신 여부 표시

            resultUpdate.text = (update == true ? "자동갱신":"자동갱신안함")

        

        let interval = ud.double(forKey: "interval")

            // 갱신 주기 표시

            resultInterval.text = "\(Int(interval))분마다"

        

    }


}



//

//  FormViewController.swift

//  SubmitValueBack

//

//  Created by stayfoolish on 24/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class FormViewController: UIViewController {


    // 이메일 주소를 입력받는 텍스트필드

    @IBOutlet var email: UITextField!

    

    // 자동 갱신 여부를 설정하는 스위치

    @IBOutlet var isUpdate: UISwitch!

    

    // 갱신 주기를 설정하는 스테퍼

    @IBOutlet var interval: UIStepper!

    

    // 자동갱신 여부를 표시하는 레이블

    @IBOutlet var isUpdateText: UILabel!

    

    // 갱신주기를 텍스트로 표시하는 레이블

    @IBOutlet var intervalText: UILabel!

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }

    

    // 자동 갱신 여부가 바뀔 때마다 호출되는 메소드

    @IBAction func onSwitch(_ sender: UISwitch) {

        if (sender.isOn == true) {

            self.isUpdateText.text = "갱신함"

        } else {

            self.isUpdateText.text = "갱신하지 않음"

        }

        

        

    }

    

    // 갱신주기가 바뀔 때마다 호출되는 메소드

    @IBAction func onStepper(_ sender: UIStepper) {

        let value = Int(sender.value)

        self.intervalText.text = "\(value)분 마다"

    }

    

    

    // Submit 버튼을 클릭했을 때 호출되는 메소드

    @IBAction func onSubmit(_ sender: Any){

        

        // UserDefault 객체의 인스턴스를 가져온다.

        let ud = UserDefaults.standard

        

        // 값을 가져온다.

        ud.set(self.email.text, forKey: "email")

        ud.set(self.isUpdate.isOn, forKey: "isUpdate")

        ud.set(self.interval.value, forKey: "interval")

        

        // 이전 화면으로 복귀한다.

        self.presentingViewController?.dismiss(animated: true)

    }

    


    /*

    // 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.

    }

    */


}
















swift submitvalue back appdelegate 스위프트 이전 화면 앱딜리게이트 데이터 전달




//

//  AppDelegate.swift

//  SubmitValueBack

//

//  Created by stayfoolish on 24/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


@UIApplicationMain

class AppDelegate: UIResponder, UIApplicationDelegate {


    var window: UIWindow?

    

    // 값을 저장할 변수를 정의

    

    var paramEmail : String? // 이메일 값을 전달받을 변수

    var paramUpdate: Bool? // 자동 갱신 여부를 전달받을 변수

    var paramInterval: Double? // 갱신주기 값을 전달받을 변수



    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {

        // Override point for customization after application launch.

        return true

    }


    func applicationWillResignActive(_ application: UIApplication) {

        // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.

        // Use this method to pause ongoing tasks, disable timers, and invalidate graphics rendering callbacks. Games should use this method to pause the game.

    }


    func applicationDidEnterBackground(_ application: UIApplication) {

        // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later.

        // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits.

    }


    func applicationWillEnterForeground(_ application: UIApplication) {

        // Called as part of the transition from the background to the active state; here you can undo many of the changes made on entering the background.

    }


    func applicationDidBecomeActive(_ application: UIApplication) {

        // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface.

    }


    func applicationWillTerminate(_ application: UIApplication) {

        // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:.

    }



}



//

//  ViewController.swift

//  SubmitValueBack

//

//  Created by stayfoolish on 24/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController {

    

    // 값을 화면에 표시하기 위한 아울렛 변수들

    @IBOutlet var resultEmail: UILabel!

    @IBOutlet var resultUpdate: UILabel!

    @IBOutlet var resultInterval: UILabel!

    

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    // 화면에 표시될 때마다 실행되는 메소드

    override func viewWillAppear(_ animated: Bool) {

        // Appdelegate 객체의 인스턴스를 가져온다.

        let ad = UIApplication.shared.delegate as? AppDelegate

        

        if let email = ad?.paramEmail {

            // 이메일 표시

            resultEmail.text = email

        }

        if let update = ad?.paramUpdate {

            // 자동 갱신 여부 표시

            resultUpdate.text = update==true ? "자동갱신":"자동갱신안함"

        }

        if let interval = ad?.paramInterval {

            // 갱신 주기 표시

            resultInterval.text = "\(Int(interval))분마다"

        }

    }


}



//

//  FormViewController.swift

//  SubmitValueBack

//

//  Created by stayfoolish on 24/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class FormViewController: UIViewController {


    // 이메일 주소를 입력받는 텍스트필드

    @IBOutlet var email: UITextField!

    

    // 자동 갱신 여부를 설정하는 스위치

    @IBOutlet var isUpdate: UISwitch!

    

    // 갱신 주기를 설정하는 스테퍼

    @IBOutlet var interval: UIStepper!

    

    // 자동갱신 여부를 표시하는 레이블

    @IBOutlet var isUpdateText: UILabel!

    

    // 갱신주기를 텍스트로 표시하는 레이블

    @IBOutlet var intervalText: UILabel!

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }

    

    // 자동 갱신 여부가 바뀔 때마다 호출되는 메소드

    @IBAction func onSwitch(_ sender: UISwitch) {

        if (sender.isOn == true) {

            self.isUpdateText.text = "갱신함"

        } else {

            self.isUpdateText.text = "갱신하지 않음"

        }

        

        

    }

    

    // 갱신주기가 바뀔 때마다 호출되는 메소드

    @IBAction func onStepper(_ sender: UIStepper) {

        let value = Int(sender.value)

        self.intervalText.text = "\(value)분 마다"

    }

    

    

    // Submit 버튼을 클릭했을 때 호출되는 메소드

    @IBAction func onSubmit(_ sender: Any){

        

        // AppDelegate 객체의 인스턴스를 가져온다.

        let ad = UIApplication.shared.delegate as? AppDelegate

        

        ad?.paramEmail = self.email.text

        ad?.paramUpdate = self.isUpdate.isOn

        ad?.paramInterval = self.interval.value

        

        

        // 이전 화면으로 복귀한다.

        self.presentingViewController?.dismiss(animated: true)

    }

    


    /*

    // 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.

    }

    */


}








swift submitvalue back 스위프트 이전 화면으로 데이터 전달



//

//  ViewController.swift

//  SubmitValueBack

//

//  Created by stayfoolish on 24/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController {

    

    // 값을 화면에 표시하기 위한 아울렛 변수들

    @IBOutlet var resultEmail: UILabel!

    @IBOutlet var resultUpdate: UILabel!

    @IBOutlet var resultInterval: UILabel!

    

    

    

    // 값을 직접 전달받을 프로퍼티들

    var paramEmail: String? // 이메일 값을 전달받을 속성

    var paramUpdate: Bool? // 자동 갱신 여부를 전달받을 속성

    var paramInterval: Double? // 갱신 주기 값을 전달받을 속성

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    // 화면에 표시될 때마다 실행되는 메소드

    override func viewWillAppear(_ animated: Bool) {

        if let email = paramEmail {

            resultEmail.text = email

        }

        if let update = paramUpdate {

            resultUpdate.text = update==true ? "자동갱신":"자동갱신안함"

        }

        if let interval = paramInterval {

            resultInterval.text = "\(Int(interval))분마다"

        }

    }


}



//

//  FormViewController.swift

//  SubmitValueBack

//

//  Created by stayfoolish on 24/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class FormViewController: UIViewController {


    // 이메일 주소를 입력받는 텍스트필드

    @IBOutlet var email: UITextField!

    

    // 자동 갱신 여부를 설정하는 스위치

    @IBOutlet var isUpdate: UISwitch!

    

    // 갱신 주기를 설정하는 스테퍼

    @IBOutlet var interval: UIStepper!

    

    // 자동갱신 여부를 표시하는 레이블

    @IBOutlet var isUpdateText: UILabel!

    

    // 갱신주기를 텍스트로 표시하는 레이블

    @IBOutlet var intervalText: UILabel!

    

    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }

    

    // 자동 갱신 여부가 바뀔 때마다 호출되는 메소드

    @IBAction func onSwitch(_ sender: UISwitch) {

        if (sender.isOn == true) {

            self.isUpdateText.text = "갱신함"

        } else {

            self.isUpdateText.text = "갱신하지 않음"

        }

        

        

    }

    

    // 갱신주기가 바뀔 때마다 호출되는 메소드

    @IBAction func onStepper(_ sender: UIStepper) {

        let value = Int(sender.value)

        self.intervalText.text = "\(value)분 마다"

    }

    

    

    // Submit 버튼을 클릭했을 때 호출되는 메소드

    @IBAction func onSubmit(_ sender: Any){

        // presentingViewController 속성을 통해 이전 화면 객체를 읽어온 다음, ViewController 타입으로 캐스팅한다.

        let preVC = self.presentingViewController

        guard let vc = preVC as? ViewController else {

            return

        }

        

        // 값을 전달한다.

        vc.paramEmail = self.email.text

        vc.paramUpdate = self.isUpdate.isOn

        vc.paramInterval = self.interval.value

        

        // 이전 화면으로 복귀한다.

        self.presentingViewController?.dismiss(animated: true)

    }

    


    /*

    // 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.

    }

    */


}











swift prepare sugue 스위프트 세그 데이터 전달



//

//  ViewController.swift

//  SubmitValue

//

//  Created by stayfoolish on 23/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    // 이메일 주소를 입력받는 텍스트필드

    @IBOutlet var email: UITextField!

    

    // 자동 갱신 여부를 설정하는 스위치

    @IBOutlet var isUpdate: UISwitch!

    

    // 갱신 주기를 설정하는 스테퍼

    @IBOutlet var interval: UIStepper!

    

    // 자동갱신 여부를 표시하는 레이블

    @IBOutlet var isUpdateText: UILabel!

    

    // 갱신주기를 텍스트로 표시하는 레이블

    @IBOutlet var intervalText: UILabel!


    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    // 자동 갱신 여부가 바뀔 때마다 호출되는 메소드

    @IBAction func onSwitch(_ sender: UISwitch) {

        if (sender.isOn == true) {

            self.isUpdateText.text = "갱신함"

        } else {

            self.isUpdateText.text = "갱신하지 않음"

        }

        


    }

    

    // 갱신주기가 바뀔 때마다 호출되는 메소드

    @IBAction func onStepper(_ sender: UIStepper) {

        let value = Int(sender.value)

        self.intervalText.text = "\(value)분 마다"

    }

    

    

    // 프레젠테이션 방식으로 화면 전환하면서 값을 전달하기

    @IBAction func onSubmit(_ sender: Any) {

        //VC2의 인스턴스 생성

        guard let rvc = self.storyboard?.instantiateViewController(withIdentifier: "RVC") as? ResultViewController else {

            return

        }

        

        // 값을 전달

        rvc.paramEmail = self.email.text! // 이메일

        rvc.paramUpdate = self.isUpdate.isOn // 자동갱신 여부

        rvc.paramInterval = self.interval.value // 갱신주기

        

        // 화면이동

        self.present(rvc, animated: true)

        

    }

    

    

    // 내비게이션 컨트롤러를 통해 화면 전환하면서 값을 전달하기

    @IBAction func onSubmitBarButton(_ sender: UIBarButtonItem) {

        //VC2의 인스턴스 생성

        guard let rvc = self.storyboard?.instantiateViewController(withIdentifier: "RVC") as? ResultViewController else {

            return

        }

        

        // 값을 전달

        rvc.paramEmail = self.email.text! // 이메일

        rvc.paramUpdate = self.isUpdate.isOn // 자동갱신 여부

        rvc.paramInterval = self.interval.value // 갱신주기

        

        // 화면이동

      self.navigationController?.pushViewController(rvc, animated: true)

        

    }

    

    @IBAction func onPerformSegue(_ sender: UIButton) {

        self.performSegue(withIdentifier: "manualSubmit", sender: self)

    }

    

    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

        // 목적지 뷰 컨트롤러 인스턴스 읽어오기

        let dest = segue.destination

        

        guard let rvc = dest as? ResultViewController else {

            return

        }

        

        // 값 전달

        rvc.paramEmail = self.email.text! // 이메일

        rvc.paramUpdate = self.isUpdate.isOn // 자동갱신여부

        rvc.paramInterval = self.interval.value // 갱신주기

    }


}



1. 메소드의 매개변수 segue의 속성 destination을 이용하여 목적지 뷰 컨트롤러의 인스턴스 참조를 가져옵니다.


2. 인스턴스의 타입을 UIViewController에서 ResultViewController 타입으로 캐스팅합니다. 실패하면 메소드 실행을 종료합니다.


3. 캐스팅된 인스턴스 상수 rvc를 이용하여 값을 전달합니다. 



//

//  ResultViewController.swift

//  SubmitValue

//

//  Created by stayfoolish on 23/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ResultViewController: UIViewController {

    

    // 화면에 값을 표시하는데 사용될 레이블

    @IBOutlet var resultEmail: UILabel! //이메일

    @IBOutlet var resultUpdate: UILabel! //자동갱신 여부

    @IBOutlet var resultInterval: UILabel! //갱신주기


    // email 값을 받을 변수

    var paramEmail: String = ""

    

    // update 값을 받을 변수

    var paramUpdate: Bool = false

    

    // Interval 값을 받을 변수

    var paramInterval: Double = 0

    


    

    override func viewDidLoad() {

        self.resultEmail.text = paramEmail

        // 3항 연산자 A? B: C A가 참이면 B를 , 거짓이면 C를 반환합니다.

        self.resultUpdate.text = (self.paramUpdate == true ? "자동갱신" : "자동갱신안함" )

        self.resultInterval.text = "\(Int(paramInterval))분 마다 갱신"

    }

    

    @IBAction func onBack(_ sender: UIButton) {

        self.presentingViewController?.dismiss(animated: true)

    }

    

}















swift submitvalue present push 스위프트 데이터 전달 




//

//  ViewController.swift

//  SubmitValue

//

//  Created by stayfoolish on 23/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    // 이메일 주소를 입력받는 텍스트필드

    @IBOutlet var email: UITextField!

    

    // 자동 갱신 여부를 설정하는 스위치

    @IBOutlet var isUpdate: UISwitch!

    

    // 갱신 주기를 설정하는 스테퍼

    @IBOutlet var interval: UIStepper!

    

    // 자동갱신 여부를 표시하는 레이블

    @IBOutlet var isUpdateText: UILabel!

    

    // 갱신주기를 텍스트로 표시하는 레이블

    @IBOutlet var intervalText: UILabel!


    

    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    // 자동 갱신 여부가 바뀔 때마다 호출되는 메소드

    @IBAction func onSwitch(_ sender: UISwitch) {

        if (sender.isOn == true) {

            self.isUpdateText.text = "갱신함"

        } else {

            self.isUpdateText.text = "갱신하지 않음"

        }

        


    }

    

    // 갱신주기가 바뀔 때마다 호출되는 메소드

    @IBAction func onStepper(_ sender: UIStepper) {

        let value = Int(sender.value)

        self.intervalText.text = "\(value)분 마다"

    }

    

    

    // 프레젠테이션 방식으로 화면 전환하면서 값을 전달하기

    @IBAction func onSubmit(_ sender: Any) {

        //VC2의 인스턴스 생성

        guard let rvc = self.storyboard?.instantiateViewController(withIdentifier: "RVC") as? ResultViewController else {

            return

        }

        

        // 값을 전달

        rvc.paramEmail = self.email.text! // 이메일

        rvc.paramUpdate = self.isUpdate.isOn // 자동갱신 여부

        rvc.paramInterval = self.interval.value // 갱신주기

        

        // 화면이동

        self.present(rvc, animated: true)

        

    }

    

    

    // 내비게이션 컨트롤러를 통해 화면 전환하면서 값을 전달하기

    @IBAction func onSubmitBarButton(_ sender: UIBarButtonItem) {

        //VC2의 인스턴스 생성

        guard let rvc = self.storyboard?.instantiateViewController(withIdentifier: "RVC") as? ResultViewController else {

            return

        }

        

        // 값을 전달

        rvc.paramEmail = self.email.text! // 이메일

        rvc.paramUpdate = self.isUpdate.isOn // 자동갱신 여부

        rvc.paramInterval = self.interval.value // 갱신주기

        

        // 화면이동

      self.navigationController?.pushViewController(rvc, animated: true)

        

    }

    

    


}





//

//  ResultViewController.swift

//  SubmitValue

//

//  Created by stayfoolish on 23/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ResultViewController: UIViewController {

    

    // 화면에 값을 표시하는데 사용될 레이블

    @IBOutlet var resultEmail: UILabel! //이메일

    @IBOutlet var resultUpdate: UILabel! //자동갱신 여부

    @IBOutlet var resultInterval: UILabel! //갱신주기


    // email 값을 받을 변수

    var paramEmail: String = ""

    

    // update 값을 받을 변수

    var paramUpdate: Bool = false

    

    // Interval 값을 받을 변수

    var paramInterval: Double = 0

    


    

    override func viewDidLoad() {

        self.resultEmail.text = paramEmail

        // 3항 연산자 A? B: C A가 참이면 B를 , 거짓이면 C를 반환합니다.

        self.resultUpdate.text = (self.paramUpdate == true ? "자동갱신" : "자동갱신안함" )

        self.resultInterval.text = "\(Int(paramInterval))분 마다 갱신"

    }

    

    @IBAction func onBack(_ sender: UIButton) {

        self.presentingViewController?.dismiss(animated: true)

    }

    

}









swift alert actionsheet 스위프트 얼럿 액션시트 




//

//  ViewController.swift

//  SimpleAlert

//

//  Created by stayfoolish on 22/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController {


    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

    }


    @IBAction func alertButton(_ sender: UIButton) {

        

        let alert: UIAlertController

        alert = UIAlertController(title: "얼럿입니다", message: "여기에 메세지를 남길 수 있어요 사용자에게 왜 이 얼럿을 보여줬는지 설명합니다", preferredStyle: UIAlertController.Style.alert)

        

     

        

        var cancelAction: UIAlertAction

        cancelAction = UIAlertAction(title: "취소", style: UIAlertAction.Style.cancel, handler: {( action: UIAlertAction) in

            print("취소 액션 선택함")

            

        })

        

        var defaultAction: UIAlertAction

        defaultAction = UIAlertAction(title: "확인", style: UIAlertAction.Style.default, handler: {( action: UIAlertAction) in

            print("확인 액션 선택함")

            

        })

        

        var destructiveAction: UIAlertAction

        destructiveAction = UIAlertAction(title: "destructive", style: UIAlertAction.Style.destructive, handler: {( action: UIAlertAction) in

            print("destructive 액션 선택함")

            

        })

        

        alert.addAction(cancelAction)

        alert.addAction(defaultAction)

        alert.addAction(destructiveAction)

        

        self.present(alert, animated: true ) {

            print("얼럿 보여짐")

        }

    }

    

    

    @IBAction func actionSheetButton(_ sender: UIButton) {

        let alert: UIAlertController

        alert = UIAlertController(title: "얼럿입니다", message: "여기에 메세지 남길 수 있어요", preferredStyle: UIAlertController.Style.actionSheet)

        

        var cancelAction: UIAlertAction

        cancelAction = UIAlertAction(title: "취소", style: UIAlertAction.Style.cancel, handler: { (action: UIAlertAction) in

            print("취소 액션시트 선택함")

        })

        

        var defaultAction: UIAlertAction

        defaultAction = UIAlertAction(title: "확인", style: UIAlertAction.Style.default, handler: { (action: UIAlertAction) in

            print("확인 액션시트 선택함")

        })

        

        var destructiveAction: UIAlertAction

        destructiveAction = UIAlertAction(title: "destructive", style: UIAlertAction.Style.destructive, handler: { (action: UIAlertAction) in

            print("destructive 액션시트 선택함")

        })

        

        alert.addAction(cancelAction)

        alert.addAction(defaultAction)

        alert.addAction(destructiveAction)

        

        

        self.present(alert,animated: true){

            print("얼럿 보여짐")

        }

    }

    

}















swift tableview JSONSerialization 스위프트 테이블뷰 제이슨



//

//  ViewController.swift

//  WeatherTable

//

//  Created by stayfoolish on 21/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController,UITableViewDataSource  {

    var datalist =  NSDictionary()


    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        let baseURL = URL(string: "https://raw.githubusercontent.com/ChoiJinYoung/iphonewithswift2/master/weather.json")

        

        do {

            self.datalist  = try JSONSerialization.jsonObject(with: Data(contentsOf: baseURL!) , options: JSONSerialization.ReadingOptions.mutableContainers) as! NSDictionary

        } catch  {

            print("Error loading Data")

        }

        

        print(self.datalist)

        

        let className = "\(type(of:(((datalist["weatherinfo"] as! NSDictionary)["local"]) as! NSArray).count))"

        print("className : \(className)")

        

   

    }

    


    

    


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return ((datalist["weatherinfo"] as! NSDictionary)["local"] as! NSArray).count

    }

    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! WeatherCell


        

        //print("indexPath row : \(indexPath.row)")

        let dicTemp = ((datalist["weatherinfo"] as! NSDictionary)["local"] as! NSArray)[indexPath.row] as! NSDictionary

        

        print("dicTemp : \(dicTemp)")

        

        cell.countryLabel.text = dicTemp["country"] as? String

        

        let weatherStr = dicTemp["weather"] as? String

        

        cell.weatherLabel.text = weatherStr

        cell.temperatureLabel.text = dicTemp["temperature"] as? String

        

        if weatherStr == "맑음" {

            cell.imgView.image = UIImage(named: "sunny.png")

        }else if weatherStr == "비" {

            cell.imgView.image = UIImage(named: "rainy.png")

        }else if weatherStr == "흐림" {

            cell.imgView.image = UIImage(named: "cloudy.png")

        }else if weatherStr == "눈" {

            cell.imgView.image = UIImage(named: "snow.png")

        }else{

            cell.imgView.image = UIImage(named: "blizzard.png")

        }

        

        return cell

    }

    

    

}




//

//  WeatherCell.swift

//  WeatherTable

//

//  Created by stayfoolish on 22/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class WeatherCell: UITableViewCell {


    @IBOutlet var countryLabel: UILabel!

    @IBOutlet var weatherLabel: UILabel!

    @IBOutlet var temperatureLabel: UILabel!

    @IBOutlet var imgView: UIImageView!

    

    override func awakeFromNib() {

        super.awakeFromNib()

        // Initialization code

    }


    override func setSelected(_ selected: Bool, animated: Bool) {

        super.setSelected(selected, animated: animated)


        // Configure the view for the selected state

    }


}



https://raw.githubusercontent.com/ChoiJinYoung/iphonewithswift2/master/weather.json


{
  "weatherinfo": {
    "local": [
      {
        "country": "한국",
        "weather": "비",
        "temperature": "20"
      },
      {
        "country": "일본",
        "weather": "맑음",
        "temperature": "19"
      },
      {
        "country": "중국",
        "weather": "눈",
        "temperature": "14"
      },
      {
        "country": "스페인",
        "weather": "우박",
        "temperature": "13"
      },
      {
        "country": "미국",
        "weather": "흐림",
        "temperature": "2"
      },
      {
        "country": "영국",
        "weather": "비",
        "temperature": "10"
      },
      {
        "country": "프랑스",
        "weather": "흐림",
        "temperature": "15"
      },
      {
        "country": "브라질",
        "weather": "흐림",
        "temperature": "35"
      },
      {
        "country": "스위스",
        "weather": "맑음",
        "temperature": "13"
      },
      {
        "country": "덴마크",
        "weather": "비",
        "temperature": "2"
      },
      {
        "country": "스웨덴",
        "weather": "눈",
        "temperature": "0"
      },
      {
        "country": "네덜란드",
        "weather": "비",
        "temperature": "12"
      },
      {
        "country": "크로아티아",
        "weather": "맑음",
        "temperature": "30"
      },
      {
        "country": "필리핀",
        "weather": "맑음",
        "temperature": "28"
      },
      {
        "country": "독일",
        "weather": "눈",
        "temperature": "3"
      },
      {
        "country": "헝가리",
        "weather": "비",
        "temperature": "13"
      },
      {
        "country": "벨기에",
        "weather": "흐림",
        "temperature": "8"
      },
      {
        "country": "핀란드",
        "weather": "우박",
        "temperature": "15"
      },
      {
        "country": "이탈리아",
        "weather": "맑음",
        "temperature": "23"
      }
    ]
  }
}






swift tableview xmlparser 스위프트 테이블뷰 xml 파싱 



//

//  ViewController.swift

//  WeatherTable

//

//  Created by stayfoolish on 21/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class ViewController: UIViewController,UITableViewDataSource, XMLParserDelegate  {

    var datalist: [[String:String]] = []

    var detaildata : [String: String] = [:]

    var elementTemp: String = ""

    var blank: Bool = false

 

    


    override func viewDidLoad() {

        super.viewDidLoad()

        // Do any additional setup after loading the view, typically from a nib.

        let baseURL = "https://raw.githubusercontent.com/ChoiJinYoung/iphonewithswift2/master/weather.xml"

        let parser = XMLParser(contentsOf: URL(string: baseURL)!)

        

        parser?.delegate = self

        parser?.parse()

    }

    

    func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) {

//        print("didStartElement : \(elementName)")

        elementTemp = elementName

        blank = true

    }

    

    func parser(_ parser: XMLParser, foundCharacters string: String) {

        if blank == true && elementTemp != "local" && elementTemp != "weatherinfo" {

//            print("foundCharacters : \(string)")

            detaildata[elementTemp] = string

        }


    }

    

    func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) {

        if elementName == "local"{

            datalist += [detaildata]

            print(detaildata)

        }

        blank = false

//        print("didEndElement : \(elementName)")

    }

    

    


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return datalist.count

    }

    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! WeatherCell

//        print("indexPath : \(indexPath)")

//        print("indexPath row : \(indexPath.row)")

        

        var dicTemp = datalist[indexPath.row]

        

//        print(dicTemp)

        

        cell.countryLabel.text = dicTemp["country"]

        

        let weatherStr = dicTemp["weather"]

        

        cell.weatherLabel.text = weatherStr

        cell.temperatureLabel.text = dicTemp["temperature"]

        

        if weatherStr == "맑음"{

            cell.imgView?.image = UIImage(named: "sunny.png")

        }else if weatherStr == "비"{

            cell.imgView?.image = UIImage(named: "rainy.png")

        }else if weatherStr == "흐림"{

            cell.imgView?.image = UIImage(named: "cloudy.png")

        }else if weatherStr == "눈"{

            cell.imgView?.image = UIImage(named: "snow.png")

        }else {

            cell.imgView?.image = UIImage(named: "blizzard.png")

            

        }

        

        

        return cell

    }

    

    

}




//

//  WeatherCell.swift

//  WeatherTable

//

//  Created by stayfoolish on 22/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class WeatherCell: UITableViewCell {


    @IBOutlet var countryLabel: UILabel!

    @IBOutlet var weatherLabel: UILabel!

    @IBOutlet var temperatureLabel: UILabel!

    @IBOutlet var imgView: UIImageView!

    

    override func awakeFromNib() {

        super.awakeFromNib()

        // Initialization code

    }


    override func setSelected(_ selected: Bool, animated: Bool) {

        super.setSelected(selected, animated: animated)


        // Configure the view for the selected state

    }


}


xml url 내용


<weatherinfo>
  <local>
    <country>한국</country>
    <weather>비</weather>
    <temperature>20</temperature>
  </local>
  <local>
    <country>일본</country>
    <weather>맑음</weather>
    <temperature>19</temperature>
  </local>
  <local>
    <country>중국</country>
    <weather>눈</weather>
    <temperature>14</temperature>
  </local>
  <local>
    <country>스페인</country>
    <weather>우박</weather>
    <temperature>13</temperature>
  </local>
  <local>
    <country>미국</country>
    <weather>흐림</weather>
    <temperature>2</temperature>
  </local>
  <local>
    <country>영국</country>
    <weather>비</weather>
    <temperature>10</temperature>
  </local>
  <local>
    <country>프랑스</country>
    <weather>흐림</weather>
    <temperature>15</temperature>
  </local>
  <local>
    <country>브라질</country>
    <weather>흐림</weather>
    <temperature>35</temperature>
  </local>
  <local>
    <country>스위스</country>
    <weather>맑음</weather>
    <temperature>13</temperature>
  </local>
  <local>
    <country>덴마크</country>
    <weather>비</weather>
    <temperature>2</temperature>
  </local>
  <local>
    <country>스웨덴</country>
    <weather>눈</weather>
    <temperature>0</temperature>
  </local>
  <local>
    <country>네덜란드</country>
    <weather>비</weather>
    <temperature>12</temperature>
  </local>
  <local>
    <country>크로아티아</country>
    <weather>맑음</weather>
    <temperature>30</temperature>
  </local>
  <local>
    <country>필리핀</country>
    <weather>맑음</weather>
    <temperature>28</temperature>
  </local>
  <local>
    <country>독일</country>
    <weather>눈</weather>
    <temperature>3</temperature>
  </local>
  <local>
    <country>헝가리</country>
    <weather>비</weather>
    <temperature>13</temperature>
  </local>
  <local>
    <country>벨기에</country>
    <weather>흐림</weather>
    <temperature>8</temperature>
  </local>
  <local>
    <country>핀란드</country>
    <weather>우박</weather>
    <temperature>15</temperature>
  </local>
  <local>
    <country>이탈리아</country>
    <weather>맑음</weather>
    <temperature>23</temperature>
  </local>  
</weatherinfo>







swift tableview customcell detail 스위프트 테이블뷰 커스텀셀 디테일 뷰 




//

//  MasterViewController.swift

//  CustomCell

//

//  Created by stayfoolish on 21/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class MasterViewController: UITableViewController {

    

    var itemList = [[String:String]]()

    

    


    override func viewDidLoad() {

        super.viewDidLoad()

        let item1 = ["name":"사과","image":"apple.jpeg","amount":"6","value":"3000원"]

        let item2=["name":"블루베리","image":"blueberry.jpg","amount":"10","value":"30000원"]

        let item3=["name":"당근","image":"carrot.jpg","amount":"13","value":"5000원"]

        let item4=["name":"체리","image":"cherry.png","amount":"1","value":"2000원"]

        let item5=["name":"포도","image":"grape.jpg","amount":"13","value":"1000원"]

        let item6=["name":"키위","image":"kiwi.png","amount":"2","value":"15000원"]

        let item7=["name":"레몬","image":"lemon.png","amount":"3","value":"6000원"]

        let item8=["name":"라임","image":"lime.jpg","amount":"4","value":"4000원"]

        let item9=["name":"고기","image":"meat.jpg","amount":"5","value":"2000원"]

        let item10=["name":"딸기","image":"strawberry.jpg","amount":"7","value":"8000원"]

        let item11=["name":"토마토","image":"tomato.png","amount":"30","value":"3000원"]

        let item12=["name":"야채","image":"vegetable.jpg","amount":"40","value":"7000원"]

        let item13=["name":"멜론","image":"watermelon.png","amount":"5","value":"10000원"]

        

        itemList = [item1, item2,item3,item4,item5,item6,item7,item8,item9,item10,item11,item12,item13]

        

        let backgroundImageView = UIImageView(image: UIImage(named: "background.jpg"))

        backgroundImageView.contentMode = UIView.ContentMode.scaleAspectFill

        backgroundImageView.frame = self.tableView.frame

        

        self.tableView.backgroundView = backgroundImageView

    }


    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        // #warning Incomplete implementation, return the number of rows

        return itemList.count

    }


    

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "reuseIdentifier", for: indexPath) as! CustomCell

        

        cell.backgroundColor = UIColor.clear


        let dictTemp = itemList[indexPath.row]

        

        cell.nameLabel.text = dictTemp["name"]

        cell.amountLabel.text = dictTemp["amount"]

        cell.valueLabel.text = dictTemp["value"]

        

        cell.imgView.image = UIImage(named: dictTemp["image"]!)

        

        

        return cell

    }

    

    // 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.

        if segue.identifier == "showDetail" {

            (segue.destination as! DetailViewController).detailData = itemList[(self.tableView.indexPathForSelectedRow)!.row]

        }

        

    }

    


    /*

    // Override to support conditional editing of the table view.

    override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {

        // Return false if you do not want the specified item to be editable.

        return true

    }

    */


    /*

    // Override to support editing the table view.

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {

        if editingStyle == .delete {

            // Delete the row from the data source

            tableView.deleteRows(at: [indexPath], with: .fade)

        } else if editingStyle == .insert {

            // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view

        }    

    }

    */


    /*

    // Override to support rearranging the table view.

    override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {


    }

    */


    /*

    // Override to support conditional rearranging of the table view.

    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {

        // Return false if you do not want the item to be re-orderable.

        return true

    }

    */



    


}


//

//  DetailViewController.swift

//  CustomCell

//

//  Created by stayfoolish on 22/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class DetailViewController: UIViewController {

    @IBOutlet var imgView: UIImageView!

    @IBOutlet var nameLabel: UILabel!

    @IBOutlet var amountLabel: UILabel!

    @IBOutlet var valueLabel: UILabel!

    

    

    

    var detailData = [String:String]()


    override func viewDidLoad() {

        super.viewDidLoad()

//        print(detailData)

        imgView.layer.cornerRadius = 50.0

        imgView.layer.masksToBounds = true

        

        

        

        nameLabel.text = detailData["name"]

        amountLabel.text = detailData["amount"]

        valueLabel.text = detailData["value"]

        imgView.image = UIImage(named: detailData["image"]!)

        

        

        // Do any additional setup after loading the view.

    }

    


    /*

    // 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.

    }

    */


}


//

//  CustomCell.swift

//  CustomCell

//

//  Created by stayfoolish on 21/11/2018.

//  Copyright © 2018 stayfoolish. All rights reserved.

//


import UIKit


class CustomCell: UITableViewCell {


    @IBOutlet var nameLabel: UILabel!

    @IBOutlet var amountLabel: UILabel!

    @IBOutlet var valueLabel: UILabel!

    @IBOutlet var imgView: UIImageView!

    

    override func awakeFromNib() {

        super.awakeFromNib()

        // Initialization code

        imgView.contentMode = UIView.ContentMode.scaleAspectFill

        imgView.layer.cornerRadius = 50.0

        imgView.layer.masksToBounds = true

    }


    override func setSelected(_ selected: Bool, animated: Bool) {

        super.setSelected(selected, animated: animated)


        // Configure the view for the selected state

    }


}











+ Recent posts