[スタンフォードiOS]第11話&12話ドラッグアンドドロップ、テーブルビュー、コレクションビュー
17257 ワード
11強目標
Drag and Drop
Demo
class EmojiArtViewController: UIViewController, UIDropInteractionDelegate {
@IBOutlet weak var dropZone: UIView! {
didSet {
dropZone.addInteraction(UIDropInteraction(delegate: self))
}
}
// 관심있는 것은 이미지와 이미지에 대한 URL
func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
return session.canLoadObjects(ofClass: NSURL.self) && session.canLoadObjects(ofClass: UIImage.self)
}
// 복사해서 가져온다.
func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
return UIDropProposal(operation: .copy)
}
var imageFetcher: ImageFetcher! // 강의 Utilities.swift 파일
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
imageFetcher = ImageFetcher() { (url, image) in
DispatchQueue.main.async {
self.emojiArtView.backgroundImage = image
}
}
session.loadObjects(ofClass: NSURL.self) { nsurls in
if let url = nsurls.first as? URL {
self.imageFetcher.fetch(url)
}
}
session.loadObjects(ofClass: UIImage.self) { images in
if let image = images.first as? UIImage {
self.imageFetcher.backup = image
}
}
}
}
Table View, Collection View
class EmojiArtViewController: UIViewController, UIDropInteractionDelegate {
@IBOutlet weak var dropZone: UIView! {
didSet {
dropZone.addInteraction(UIDropInteraction(delegate: self))
}
}
// 관심있는 것은 이미지와 이미지에 대한 URL
func dropInteraction(_ interaction: UIDropInteraction, canHandle session: UIDropSession) -> Bool {
return session.canLoadObjects(ofClass: NSURL.self) && session.canLoadObjects(ofClass: UIImage.self)
}
// 복사해서 가져온다.
func dropInteraction(_ interaction: UIDropInteraction, sessionDidUpdate session: UIDropSession) -> UIDropProposal {
return UIDropProposal(operation: .copy)
}
var imageFetcher: ImageFetcher! // 강의 Utilities.swift 파일
func dropInteraction(_ interaction: UIDropInteraction, performDrop session: UIDropSession) {
imageFetcher = ImageFetcher() { (url, image) in
DispatchQueue.main.async {
self.emojiArtView.backgroundImage = image
}
}
session.loadObjects(ofClass: NSURL.self) { nsurls in
if let url = nsurls.first as? URL {
self.imageFetcher.fetch(url)
}
}
session.loadObjects(ofClass: UIImage.self) { images in
if let image = images.first as? UIImage {
self.imageFetcher.backup = image
}
}
}
}
dataSource
:要求データdelegate
:データの外観を設定Demo
class EmojiArtDocumentTableViewController: UITableViewController {
var emojiArtDocuments = ["One", "Two", "Three"]
// MARK: - UITableViewDataSource
// section의 개수
override func numberOfSections(in tableView: UITableView) -> Int {
return 1
}
// section마다 행의 개수
override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return emojiArtDocuments.count
}
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// 재사용할 수 있는 큐
let cell = tableView.dequeueReusableCell(withIdentifier: "DocumentCell", for: indexPath)
cell.textLabel?.text = emojiArtDocuments[indexPath.row]
return cell
}
// + 버튼 클릭 시 배열에 Untitled를 추가하지만 Utilities.swift에 있는 메소드를 활용해 이름 중복이 발생해도 숫자가 뒤에 붙는다.
@IBAction func newEmojiArt(_ sender: UIBarButtonItem) {
emojiArtDocuments += ["Unititled".madeUnique(withRespectTo: emojiArtDocuments)]
tableView.reloadData() // 테이블뷰 새로고침
}
/*
// 행 편집 가능 (기본값: true)
// 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 func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
if editingStyle == .delete {
emojiArtDocuments.remove(at: indexPath.row)
tableView.deleteRows(at: [indexPath], with: .fade)
} else if editingStyle == .insert {
}
}
}
12強目標
CollectionView
Demo
UITextField
becomeFirstResponder
:最初の応答者はキーボードからキーボードイベントを受信する.resignFirstResponder
:最初の応答者になるのを止め、キーボードが消えます.textFieldShouldReturn(sender: UITextField) -> Bool
:Returnクリック時textFieldDidEndEditing(sender: UITextField)
:テキストフィールドを変更するときに他のテキストフィールドをクリックすると、最初の応答者が置き換えられます.リンク
Reference
この問題について([スタンフォードiOS]第11話&12話ドラッグアンドドロップ、テーブルビュー、コレクションビュー), 我々は、より多くの情報をここで見つけました https://velog.io/@hhhan0315/스탠포드-iOS-11강-12강-드래그-드랍-테이블-뷰와-컬렉션-뷰テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol