Slide 1

Slide 1 text

6*$POUSPMͱ6*,FZ*OQVUͰ 6*1JDLFS7JFXΛ खܰʹԼ͔Βγϡοͱग़͢ ,B[VIJSP)":"4)* J04-5

Slide 2

Slide 2 text

6*1JDLFS7JFXΈ͍ͨͳೖྗ༻6*ΛԼ͔Βग़࣌ͬͯ͢ Ͳ͜ʹஔ͍ͯ·͔͢ʁ

Slide 3

Slide 3 text

w "DUJPO4IFFU w ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX

Slide 4

Slide 4 text

w "DUJPO4IFFU w ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX

Slide 5

Slide 5 text

w "DUJPO4IFFU w ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX

Slide 6

Slide 6 text

ʔ ຊདྷͷ࢖͍ํͰ͸ͳ͍ ʔ ࡞Δͷ໘౗ ʔ 5FYU'JFME෦෼͍Βͳ͍ w "DUJPO4IFFU w ಠࣗͷ6*ʁ w 6*5FYU'JFMEͷJOQVU7JFX

Slide 7

Slide 7 text

ࣗ࡞7JFXͰ ΧελϜιϑτ΢ΣΞΩʔϘʔυ Λݺ΂ΔΑ͏ʹ͢Δͷ͕ ָͰΧελϚΠζੑߴ͠

Slide 8

Slide 8 text

࡞Γํ

Slide 9

Slide 9 text

6*$POUSPMΛܧঝ͢Δ λονΛड͚औΔೖྗ༻Ϋϥεͱͯ͠ศརͳͷͰ࢖͍·͢ class PickerKeyboard: UIControl { private var textStore: String = "" }

Slide 10

Slide 10 text

6*,FZ*OQVUΛܧঝ͢Δ 6*,FZ*OQVUΛܧঝͨ͠ΫϥεΛ࢖͏ͱࣗ༝ʹιϑτ΢ΣΞ ΩʔϘʔυ͕දࣔͤ͞ΒΕ·͢ extension PickerKeyboard: UIKeyInput { var hasText: Bool { return !textStore.isEmpty } func insertText(_ text: String) { textStore += text setNeedsDisplay() } func deleteBackward() { textStore.remove( at: textStore.characters.index( before: textStore.characters.endIndex)) setNeedsDisplay() } }

Slide 11

Slide 11 text

6*,FZ*OQVUΛܧঝ͢Δ 6*,FZ*OQVUΛܧঝͨ͠ΫϥεΛ࢖͏ͱࣗ༝ʹιϑτ΢ΣΞ ΩʔϘʔυ͕දࣔͤ͞ΒΕ·͢ extension PickerKeyboard: UIKeyInput { var hasText: Bool { return !textStore.isEmpty } func insertText(_ text: String) { textStore += text setNeedsDisplay() } func deleteBackward() { textStore.remove( at: textStore.characters.index( before: textStore.characters.endIndex)) setNeedsDisplay() } } ͜ͷ̏ͭΛ࣮૷͢Ε͹େৎ෉

Slide 12

Slide 12 text

6*,FZ*OQVUΛܧঝ͢Δ 6*,FZ*OQVUΛܧঝͨ͠ΫϥεΛ࢖͏ͱࣗ༝ʹιϑτ΢ΣΞ ΩʔϘʔυ͕දࣔͤ͞ΒΕ·͢ extension PickerKeyboard: UIKeyInput { var hasText: Bool { return !textStore.isEmpty } func insertText(_ text: String) { textStore += text setNeedsDisplay() } func deleteBackward() { textStore.remove( at: textStore.characters.index( before: textStore.characters.endIndex)) setNeedsDisplay() } }

Slide 13

Slide 13 text

λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτ΢ΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }

Slide 14

Slide 14 text

λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτ΢ΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }

Slide 15

Slide 15 text

λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτ΢ΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }

Slide 16

Slide 16 text

λοϓͰ7JFXΛ'JSTU3FTQPOEFSʹ͢Δ ઌఔͷΫϥε͕'JSTU3FTQPOEFSʹͳΔͱιϑτ΢ΣΞΩʔ Ϙʔυ͕ग़͖ͯ·͢ class PickerKeyboard: UIControl { required init?(coder aDecoder: NSCoder) { super.init(coder: aDecoder) addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) } func didTap(sender: PickerKeyboard) { becomeFirstResponder() } override var canBecomeFirstResponder: Bool { return true } }

Slide 17

Slide 17 text

6*3FTQPOEFSͷJOQVU7JFX ͱͯ͠6*1JDLFS7JFXΛฦ͢ JOQVU7JFX͕ฦ͢7JFX͸ɺιϑτ΢ΣΞΩʔϘʔυͷ୅ΘΓ ͱͯ͠දࣔ͞Ε·͢ class PickerKeyboard: UIControl { override var inputView: UIView? { let pickerView = UIPickerView() pickerView.delegate = self let row = data.index(of: textStore) ?? -1 pickerView.selectRow(row, inComponent: 0, animated: false) return pickerView } }

Slide 18

Slide 18 text

6*3FTQPOEFSͷJOQVU7JFX ͱͯ͠6*1JDLFS7JFXΛฦ͢ JOQVU7JFX͕ฦ͢7JFX͸ɺιϑτ΢ΣΞΩʔϘʔυͷ୅ΘΓ ͱͯ͠දࣔ͞Ε·͢ class PickerKeyboard: UIControl { override var inputView: UIView? { let pickerView = UIPickerView() pickerView.delegate = self let row = data.index(of: textStore) ?? -1 pickerView.selectRow(row, inComponent: 0, animated: false) return pickerView } }

Slide 19

Slide 19 text

6*3FTQPOEFSͷJOQVU7JFX ͱͯ͠6*1JDLFS7JFXΛฦ͢ JOQVU7JFX͕ฦ͢7JFX͸ɺιϑτ΢ΣΞΩʔϘʔυͷ୅ΘΓ ͱͯ͠දࣔ͞Ε·͢ class PickerKeyboard: UIControl { override var inputView: UIView? { let pickerView = UIPickerView() pickerView.delegate = self let row = data.index(of: textStore) ?? -1 pickerView.selectRow(row, inComponent: 0, animated: false) return pickerView } }

Slide 20

Slide 20 text

6*1JDLFS7JFXͷ %FMFHBUF %BUB4PVSDFΛ࣮૷ class PickerKeyboard: UIControl { var data: [String] = ["Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sut.", "Sun."] // .. } extension PickerKeyboard: UIPickerViewDelegate, UIPickerViewDataSource { func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return data.count } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return data[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { textStore = data[row] setNeedsDisplay() } }

Slide 21

Slide 21 text

6*1JDLFS7JFXͷ %FMFHBUF %BUB4PVSDFΛ࣮૷ class PickerKeyboard: UIControl { var data: [String] = ["Mon.", "Tue.", "Wed.", "Thu.", "Fri.", "Sut.", "Sun."] // .. } extension PickerKeyboard: UIPickerViewDelegate, UIPickerViewDataSource { func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { return data.count } func numberOfComponents(in pickerView: UIPickerView) -> Int { return 1 } func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return data[row] } func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { textStore = data[row] setNeedsDisplay() } } આ໌লུ ཁ͢Δʹ6*1JDLFS7JFXΛී௨ʹ࣮૷͍ͯͩ͘͠͞

Slide 22

Slide 22 text

JOQVU"DDFTTPSZ7JFXʹด͡ΔϘλ ϯΛ഑ஔ͢Δ 6*3FTQPOEFSͷJOQVU"DDFTTPSZ7JFX͸ ΩʔϘʔυͷ্ʹ͍ͬͭͯ͘͘Δ೚ҙͷ7JFXΛฦͤ·͢ class PickerKeyboard: UIControl { // .. func didTapDone(sender: UIButton) { resignFirstResponder() } override var inputAccessoryView: UIView? { let button = UIButton(type: .system) // .. button.addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) let view = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: 44)) // .. view.addSubview(button) return view } }

Slide 23

Slide 23 text

JOQVU"DDFTTPSZ7JFXʹด͡ΔϘλ ϯΛ഑ஔ͢Δ 6*3FTQPOEFSͷJOQVU"DDFTTPSZ7JFX͸ ΩʔϘʔυͷ্ʹ͍ͬͭͯ͘͘Δ೚ҙͷ7JFXΛฦͤ·͢ class PickerKeyboard: UIControl { // .. func didTapDone(sender: UIButton) { resignFirstResponder() } override var inputAccessoryView: UIView? { let button = UIButton(type: .system) // .. button.addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) let view = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: 44)) // .. view.addSubview(button) return view } }

Slide 24

Slide 24 text

JOQVU"DDFTTPSZ7JFXʹด͡ΔϘλ ϯΛ഑ஔ͢Δ 6*3FTQPOEFSͷJOQVU"DDFTTPSZ7JFX͸ ΩʔϘʔυͷ্ʹ͍ͬͭͯ͘͘Δ೚ҙͷ7JFXΛฦͤ·͢ class PickerKeyboard: UIControl { // .. func didTapDone(sender: UIButton) { resignFirstResponder() } override var inputAccessoryView: UIView? { let button = UIButton(type: .system) // .. button.addTarget(self, action: #selector(PickerKeyboard.didTap(sender:)), for: .touchUpInside) let view = UIView(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: 44)) // .. view.addSubview(button) return view } }

Slide 25

Slide 25 text

σϞ

Slide 26

Slide 26 text

·ͱΊ w 6*,FZ*OQVUΛܧঝ͢Δͱιϑτ΢ΣΞΩʔϘʔ υΛΧελϚΠζͨ͠7JFX͕ग़ͤΔ w 6*1JDLFS7JFX͸͜ΕͰग़͢ͷ͕Ұ൪ͬ͘͠Γ͘ Δؾ͕͢Δ

Slide 27

Slide 27 text

ࢀߟࢿྉ w ࠓ೔ॻ͍ͨίʔυͷશମ w IUUQTHJTUHJUIVCDPNLB[VIJSPEBDEFEEGGFF w ݩهࣄʮ6*$POUSPMͱ6*,FZ*OQVUͰ6*1JDLFS7JFXΛखܰʹԼ͔Βγϡοͱग़͢2JJUBʯ w IUUQRJJUBDPNLB[VIJSPJUFNTEGDBC w 6*,FZ*OQVUͷϦϑΝϨϯε w IUUQTEFWFMPQFSBQQMFDPNSFGFSFODFVJLJUVJLFZJOQVU