05 장
UINavigationController
을 이용한 뷰(UIViewController
) 전환, 뷰 간 데이터 전달하기(prepareForSegue
)
// ViewController.swift
// TableDataPassTest
// XCode 8.3.2
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
var titleData = ["Korea", "China", "Japan", "England"]
var subTitleData = ["Seoul", "Peking", "Tyokyo", "Rondon" ]
@IBOutlet weak var myTableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
myTableView.dataSource = self
myTableView.delegate = self
}
// Delegate Methods...
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return titleData.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let myCell = myTableView.dequeueReusableCell(withIdentifier: "myCell", for: indexPath)
myCell.textLabel?.text = titleData[indexPath.row]
myCell.detailTextLabel?.text = subTitleData[indexPath.row]
return myCell
}
// Segue를 통해 DetailViewController에 데이터 넘기기
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
if segue.identifier == "goDetail" {
let detailVC = segue.destination as! DetailViewController
// 테이블뷰에서 선택한 indexPath.row
let selectedPath = myTableView.indexPathForSelectedRow
detailVC.titleData = titleData[(selectedPath?.row)!]
}
}
}
// DetailViewController.swift
// TableDataPassTest
import UIKit
class DetailViewController: UIViewController {
@IBOutlet weak var titleLabel: UILabel!
var titleData: String?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
titleLabel.text = titleData
// Navigation title 설정
title = titleData
}
/*
// 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.destinationViewController.
// Pass the selected object to the new view controller.
}
*/
}
// ViewController.swift
// ViewController Switching & Data Passing
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableView: UITableView!
var data = ["Dog", "Cat", "Cow", "Pig", "dolphin"]
var subData = ["강아지", "고양이", "황소", "돼지", "돌고래"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//4. delegate 연결
tableView.delegate = self
tableView.dataSource = self
}
// 1. Delegate 객체에게 Section의 갯수 생성 요청
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
// 2. Delegate 객체에게 Section 내의 row의 갯수 생성 요청
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
// 3. cell의 메모리 할당 생성 및 데이터 출력
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//let cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell!
let cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
//let row = indexPath.row
cell.textLabel?.text = data[indexPath.row]
cell.detailTextLabel?.text = subData[indexPath.row]
// cell image 넣기
let myImage = UIImage(named: data[indexPath.row]+".jpg")
//let myImageView = UIImageView(image: myImage)
cell.imageView?.image = myImage
/// Accessory Type
// if indexPath.row == 0 {
// cell.accessoryType = UITableViewCellAccessoryType.Checkmark
// } else if indexPath.row == 1 {
// cell.accessoryType = UITableViewCellAccessoryType.DetailButton
// } else if indexPath.row == 2 {
// cell.accessoryType = UITableViewCellAccessoryType.DetailDisclosureButton
// } else {
// cell.accessoryType = UITableViewCellAccessoryType.DisclosureIndicator
// }
return cell
}
// cell 지우기
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete {
data.removeAtIndex(indexPath.row)
tableView.reloadData()
}
}
// ViewController의 데이터를 DetailViewController로 전달하기
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goDetail" {
if let detailVC = segue.destinationViewController as? DetailViewController {
let path = tableView.indexPathForSelectedRow
// Data를 label에 넘기기
detailVC.myData = data[(path?.row)!]
// subData를 네비게이션 바의 title에 넘기기
detailVC.title = subData[(path?.row)!]
// 이미지 넘기기
detailVC.detailImage = data[(path?.row)!] + ".jpg"
}
}
}
// cell을 tap 할때 index 출력
// UITableViewDelegate에 있는 메소드
// func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
// print("You selected \(indexPath.section)th section... \(indexPath.row)th row")
//
//
// }
// section Header 설정
// UITableViewDataSource에 있는 메소드
// func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
// return "Section \(section)"
// }
}
// DetailViewController.swift
import UIKit
class DetailViewController: UIViewController {
@IBOutlet var detailData: UILabel!
@IBOutlet var myImageView: UIImageView!
var myData:String?
var mySubData:String?
var detailImage:String?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
detailData.text = myData
//title = "title Test"
myImageView.image = UIImage(named: detailImage!)
}
}
형변환(downcasting)에 대하여? as!, as?
- as?는 변환하고자 하는 형(downcast type)의 optional 값을 return 함(conditional downcast)
- as!는 force-unwrap 형태로 변환 함. as!는 다운캐스팅이 항상 성공적인 것을 확신할때 사용되며, 그렇지 않을 경우 runtime 오류가 발생함 (forced downcast)
// ViewController의 데이터를 DetailViewController로 전달하기
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goDetail" {
if let detailVC = segue.destinationViewController as? DetailViewController {
let path = tableView.indexPathForSelectedRow
// Data를 label에 넘기기
detailVC.myData = data[(path?.row)!]
// subData를 네비게이션 바의 title에 넘기기
detailVC.title = subData[(path?.row)!]
// 이미지 넘기기
detailVC.detailImage = data[(path?.row)!] + ".jpg"
}
}
}
UIWebView
사용하기
- iOS 앱에서 웹(HTTP) 페이지를 접근하기 위한 보안 설정 방법(info.plist 화일 편집)
// ViewController.swift
// WebView Test
import UIKit
class ViewController: UIViewController, UIWebViewDelegate {
@IBOutlet var myWebView: UIWebView!
@IBOutlet var myActivityIndicator: UIActivityIndicatorView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
// Webview delegate 연결
myWebView.delegate = self
// 1. resource를 표햔하는 URL 객체 생성
//let myURL = NSURL(string: "http://www.apple.com")
let myURL = NSURL(string: "http://m.google.com")
// 2. URL request 객체 생성
let myURLRequest = NSURLRequest(URL: myURL!)
// 3. load request
myWebView.loadRequest(myURLRequest)
}
// UIVebview Delegate functions
// Activity Indicator animation start
func webViewDidStartLoad(webView: UIWebView) {
myActivityIndicator.startAnimating()
}
// Activity Indicator animation stop
func webViewDidFinishLoad(webView: UIWebView) {
myActivityIndicator.stopAnimating()
}
// 웹전송 오류 발생
func webView(webView: UIWebView, didFailLoadWithError error: NSError?) {
print("network error 발생")
}
}
UITabBarController
사용하기
// ViewController.swift
// ViewController Switching & Data Passing
import UIKit
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet var tableView: UITableView!
var data = ["Dog", "Cat", "Cow", "Pig", "dolphin"]
var subData = ["강아지", "고양이", "황소", "돼지", "돌고래"]
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
//4. delegate 연결
tableView.delegate = self
tableView.dataSource = self
}
// 1. Delegate 객체에게 Section의 갯수 생성 요청
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
// 2. Delegate 객체에게 Section 내의 row의 갯수 생성 요청
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return data.count
}
// 3. cell의 메모리 할당 생성 및 데이터 출력
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
//let cell = tableView.dequeueReusableCellWithIdentifier("cell") as UITableViewCell!
let cell:UITableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath)
//let row = indexPath.row
cell.textLabel?.text = data[indexPath.row]
cell.detailTextLabel?.text = subData[indexPath.row]
// cell image 넣기
let myImage = UIImage(named: data[indexPath.row]+".jpg")
//let myImageView = UIImageView(image: myImage)
cell.imageView?.image = myImage
return cell
}
// cell 지우기
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
if editingStyle == UITableViewCellEditingStyle.Delete {
data.removeAtIndex(indexPath.row)
tableView.reloadData()
}
}
// ViewController의 데이터를 DetailViewController로 전달하기
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "goDetail" {
if let detailVC = segue.destinationViewController as? DetailViewController {
let path = tableView.indexPathForSelectedRow
// Data를 label에 넘기기
detailVC.myData = data[(path?.row)!]
// subData를 네비게이션 바의 title에 넘기기
detailVC.title = subData[(path?.row)!]
// 이미지 넘기기
detailVC.detailImage = data[(path?.row)!] + ".jpg"
}
}
}
}
// DetailViewController.swift
import UIKit
class DetailViewController: UIViewController {
@IBOutlet var detailData: UILabel!
@IBOutlet var myImageView: UIImageView!
var myData:String?
var mySubData:String?
var detailImage:String?
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
detailData.text = myData
//title = "title Test"
myImageView.image = UIImage(named: detailImage!)
}
}
// WebViewController.swift
import UIKit
class WebViewController: UIViewController {
@IBOutlet var myWebView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
if let url = NSURL(string: "https://www.instagram.com/explore/tags/animal/") {
let request = NSURLRequest(URL: url)
myWebView.loadRequest(request)
}
// forced unwrapping
/*
let url = NSURL(string: "https://www.instagram.com/explore/tags/animal/")
let request = NSURLRequest(URL: url!)
myWebView.loadRequest(request)
*/
}
}
[코딩 문제 12] Segue를 이용하여 ViewController 간의 데이터 넘겨 주기
- Button을 터치하면 두개의 ViewController 간 Button(I love iOS, Happy Coding)에 있는 title 스트링 값을 전달하여 Lable(I love iOS, Happy Coding)에 출력한다.
FirstViewController
SecondViewController
FirstViewController