[スタンフォードiOS]第11話&12話ドラッグアンドドロップ、テーブルビュー、コレクションビュー


11強目標

  • Drag and Drop
  • UITableView
  • UICollectionView
  • 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

  • UIscrollViewのサブクラス
  • 無限量の情報を提供する.
  • TableViewCollectionView
  • 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強目標

  • 11強
  • UITextField
  • CollectionView


  • 集合ビューの幅、高さに比べてセルサイズは大きくできません.
  • Demo



    UITextField

  • 修正可能なUILabel
  • キーボード表示と入力.
  • becomeFirstResponder:最初の応答者はキーボードからキーボードイベントを受信する.
  • resignFirstResponder:最初の応答者になるのを止め、キーボードが消えます.
  • textFieldShouldReturn(sender: UITextField) -> Bool:Returnクリック時
  • textFieldDidEndEditing(sender: UITextField):テキストフィールドを変更するときに他のテキストフィールドをクリックすると、最初の応答者が置き換えられます.
  • リンク

  • edwith:[Stanford]SWIFTを使用してiOS 11アプリケーションを開発