また1からこつこつと

最高はひとつじゃないと信じてまたがんばります。

【Swift3】UITableViewCellをタップしたときに画面遷移をさせる

このブログで1番読まれてる記事がこれ
mjk0513.hateblo.jp

これはSwift1.x系での記法のままなので新しくSwift3.x系で書き直します。

ViewController.swift

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
	
	let myTableView:UITableView = UITableView()

	let items:[String] = ["北海道", "青森", "秋田", "岩手", "福島", "宮城", "山形"]
	
	override func viewDidLoad() {
		super.viewDidLoad()
		
		myTableView.frame = self.view.bounds
		myTableView.dataSource = self
		myTableView.delegate = self
		myTableView.register(UITableViewCell.self, forCellReuseIdentifier: "MyCell")
		self.view.addSubview(myTableView)
	}

	override func didReceiveMemoryWarning() {
		super.didReceiveMemoryWarning()
		// Dispose of any resources that can be recreated.
	}

	func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
		return items.count
	}
	
	func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
		let cell:UITableViewCell = UITableViewCell(style: .default, reuseIdentifier: "MyCell")
		cell.textLabel?.text = items[indexPath.row]
		return cell
	}
	
	func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
		//セルの選択解除
		tableView.deselectRow(at: indexPath, animated: true)
		
		//ここに遷移処理を書く
		self.present(SecondViewController(), animated: true, completion: nil)
	}

}

次に遷移先のViewです
SecondViewController.swfit

import UIKit

class SecondViewController: UIViewController {
	
	override func viewDidLoad() {
		super.viewDidLoad()
		
		self.view.backgroundColor = UIColor.white
		
		let backButton:UIButton = UIButton()
		backButton.frame = CGRect(x: 0, y: 0, width: 100, height: 100)
		backButton.setTitle("back", for: .normal)
		backButton.setTitleColor(UIColor.blue, for: .normal)
		backButton.layer.position = CGPoint(x: self.view.frame.width/2, y: self.view.frame.height/2)
		backButton.addTarget(self, action: #selector(back), for: .touchUpInside)
		self.view.addSubview(backButton)
		
	}
	
	func back() {
		self.dismiss(animated: true, completion: nil)
	}
	
}

ポイントはdidSelectRowAtというメソッドを呼び出して、その中に遷移する処理を書くことです。

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
	//セルの選択解除
	tableView.deselectRow(at: indexPath, animated: true)
		
	//ここに遷移処理を書く
	self.present(SecondViewController(), animated: true, completion: nil)
}

ちなみに、tableView.deselectRow()をやらないとAppleの審査通らないので注意です。
これがSwift3での画面遷移処理でした!

ESDとか環境教育がおもしろい

環境教育論っていう授業のレポート書いてて、ESDとかSDGsについてdigりまくってたら結構いい感じに知見を得た。ココらへんの分野はすごく自分好みなのですっと入ってくるの嬉しい。


ESDは、Education for Sustainable Developmentの略で、持続可能な開発のための教育と訳される。つまり、持続可能な開発をしていくためには現世代だけではなく次世代にも必要だよねみたいな話。
ESD(Education for Sustainable Development):文部科学省

SDGsとは、Sustainable Development Goalsの略で、持続可能な開発目標と訳される。世界をより良い方向に修正するためにはこういうことが必要だよねっていう目標が示された。
www.unic.or.jp

https://www.jica.go.jp/aboutoda/sdgs/ku57pq00001qfok2-img/sdgs_02.gif

SDGsで示されたゴールは以下の通り。

  1. 貧困をなくそう
  2. 飢餓をゼロに
  3. すべての人に健康と福祉を
  4. 質の高い教育をみんなに
  5. ジェンダー平等を実現しよう
  6. 安全な水とトイレを世界中に
  7. エネルギーをみんなに、そしてクリーンに
  8. 働きがいも経済成長も
  9. 産業と技術革新の基盤を作ろう
  10. 人や国の不平等をなくそう
  11. 住み続けられるまちづくりを
  12. つくる責任、使う責任
  13. 気候変動に具体的な対策を
  14. 海の豊かさを守ろう
  15. 陸の豊かさも守ろう
  16. 平和と校正をすべての人に
  17. パートナーシップで目標を達成しよう

確かにこれらすべてのゴールを達成できたら、すごくいい地球になるし、めちゃくちゃいいことだと思う。まあ当然すぐに達成できるようなものなどないけど、これらの問題にしっかりと取り組みましょうという意思を国連が示したのはとてもいいこと。
SDGsがリリースされたのは2016年1月1日のこと。対してESDのほうは1997年には草案が話し合われていた。
でも、ESDで扱う内容はまさにSDGsでゴールに設定されたことばかり。
具体的な定義付がされてESDは取り組みやすくなったんじゃないかなと思う。

で、環境教育はなにかっていう話ですが、ざっくりいうとESDの一分野だと自分は思っている。今回レポート書いてて自分なりに定義付けをした。

環境教育とは私たちが住んでいる地球という星の現状を知り、私たち人間も含む生き物たちがこれからどのように生きていくかを考えるためにある。

言ってしまえばこれはESDの目標にもなると思うのだけど、それだけESDの各分野は境界線がないということだ。さらに言うとESDには境界線がないほうが本来の意味に近づくのでほんとはよかったりする。

ココらへんの分野はけっこう好きなので引き続きリサーチがんばりたい。

#SPAJAM 2017 東京C予選で優秀賞を頂いた。

#SPAJAM 2017 東京C予選にチームで出場しまして、結果的に優秀賞をいただきました!


メンバーのみなさんお疲れ様でしたm(__)m
今回もほぼほぼ徹夜での作業、大変だったけどかなりいいハッカソンだったなと思います。

東京C予選のテーマは「子ども」で、僕らが作ったのは「家庭内仮想通貨システム」である「Pocket money」というアプリです。
ちょまどさんがいい感じに呟いてくれてたので引用。



実際につかったスライドはここから見れます。

今回チームでこだわったところは、APIの設計でした。
はじめの2時間くらいはずっとAPI周りの設計をやってて、本番開発さながらの仕様書をまとめました。
まず機能ごとにどんなデータをサーバに格納して、どんな処理をさせてそれをiOS側に渡すのかといった話し合いをして、そこからさらにスマートに機能を集約していった結果、20個のAPI
ができました。
とはいえ、スプレッドシートに仕様をまとめるだけでは動かないわけで、そこからさらにMySQL+PHPでごりごりハードコーディングをする作業になります。自分がバックエンド担当してたんですが、初日はほとんどXcode開いてないです。
ただ、仕様がしっかりと決まっているのでバックエンド側を作っていくと同時にフロント側のモデルもどんどん作られていくという、非常に気持ちのよいフロントーバックの連携だったなと思います。

チームメンバー4人のうち、1人がiOSでのAPIリクエスト周りを担当、1人がバックエンドを担当、2人がフロントのデザイン周りを担当するといったフォーメーションでした。デザインは個々の感性を頼りにして気合でどうにかする、みたいな開発方法でした。

でもいままで出たハッカソンの中でも1番楽しかったし、なにより雰囲気がかなりよかったなと思っています。会場であるYahooLodgeが新しくて、物理的にも明るいというのもあるかもしれませんが、チーム毎の雰囲気だったり会場全体の雰囲気がすごくほんわかしていました。
いいハッカソンだったと思います!
女性の割合がめちゃ多かったのも要因の1つだと思います。


男子オンリーのチームは僕らだけだったらしい、ジェンダーバランス!

ちなみに、この案を出したのは弊チームのメンバーでした。

あと、個人的に他のチームでおもしろいなと思ったのは、WWDC2017で発表されたばかりのARKitをフル活用していたチームです。
プレゼンでも、公式ドキュメントしか情報がない中での開発だと仰っていましたが、日本時間火曜の深夜2時に出たフレームワークを土曜日には使いはじめるってめちゃくちゃかっこいいです。

iOS11 betaの新しいコントロールセンターが見えたときに会場がざわついたのは、さすがスマホアプリのハッカソンだなぁという感じでめちゃよかったです👍👍


優秀賞チームは全国の予選でかなり選ばれているので、これから本戦にいけるかどうかはわかりませんが、ぜひ温泉に行きたいのでいけるよう願っています。

ScratchDay 2017 in Kashiwa を開催しました。

5月14日(日)に柏市立柏中学校でScratchDay 2017 in Kashiwaを開催しました!
scratchday-kashiwa.org


f:id:mjk0513:20170518201909j:plain
ご参加くださった皆様、大変ありがとうございました。
来場者数は170名以上で、昨年を大きく上回りました。

mjk0513.hateblo.jp
↑去年の記事です。

現在アーカイブ用映像などは鋭意製作中ですので、もうしばらくお待ち下さい。


柏市教育委員会学校教育課副参事の佐和さんとのトークセッションは、ノープランだったのにも関わらずかなりいい感じなできになったと思います。
f:id:mjk0513:20170518202738j:plain
我々のような一民間団体と行政が本気になって取り組むプロジェクトがどこまで本気かというのをお見せするいい機会になったのではないでしょうか。
いろいろと次に繋がる展開が見えてくる、そんなセッションでした。

今回は柏市教育委員会が共催として入ってくれただけではなく、様々な方々にご協力いただいています。
例えば、Microsoft様にはSurfaceを貸し出していただきました。



最後に、この話はイベント中になんどもしていたのですが、プログラミング教育を一過性のブームとして終わらせないことが大切だということを、改めて書いておきます。
少し前まではまったく考えられなかった規模で、プログラミング教育が広がっています。
完全にブームです。
しかし、我々中にいるメンバーは、このブームが終わったあとのことをそろそろ真剣に考えたほうがいいと最近感じています。
大切なのは、ブームだともてはやされている時期にどれだけメジャーにするかです。言い換えるならば、どれだけ体力を付けるかだと思います。
これはビジネス面もそうですが、学問の面からも同じことが言えるはずです。きっちりと体系化していく作業をしなければならない。
そういったことを考えてみたいなぁとここ最近やんわりと思っています。
まずは圧倒的サーベイからですね、がんばります。

2017/05/22 追記
振り返りPVを公開しました。
youtu.be

【Swift3】 presentで画面遷移したときに遷移先のViewにNavigationBarを表示させておく

let nextViewController:NextViewController() = NextViewController()
let navigationController = UINavigationController(rootViewController: nextViewController)
self.present(navigationController, animated: true, completion: nil)

rootViewControllerに指定して、navigationControllerをpresentしてあげるだけ。

【Swift3】UITableView separator のおはなし

UITableViewのcellとcellの間にある線がある。これをseparatorという。(そのまま)
こいつに関して幾つか知見を得たのでメモ。

画面の左端まで線を到達させる

separatorはデフォルトでは画面の左端まで到達せずに切れてる。
f:id:mjk0513:20170330233851p:plain:w300
これを左端までつける方法。

tableView.separatorInset = .zero

これでOK。
f:id:mjk0513:20170330233916p:plain:w300

色も変えることができる。

tableView.separatorColor = UIColor()

f:id:mjk0513:20170330234848p:plain:w300

ここまでカスタマイズできるのはすごい。

ただ、これだとindexPath == 0、つまり1番上のcellの上に線が入らない。
こういったことを実装したい場合は、cellにUIViewを追加するしかないっぽい。

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
 let cell = UITableViewCell(style: .default, reuseIdentifier: "MyCell")
 cell.textLabel?.text = items[indexPath.row]
 if indexPath.row == 0{
  let separatorView:UIView = UIView(frame: CGRect(x: 0, y: 0, width: self.view.frame.width, height: 1))
  separatorView.backgroundColor = UIColor.red
  cell.addSubview(separatorView)
 }
 return cell
}

f:id:mjk0513:20170330235420p:plain:w300

これextensionつくってgithubで公開してる。
github.com

ただ、didSelectRowされたときに、deselectRowを指定してると描画が変な感じになっちゃう。
どうすればいいか考えてみます。

【Swift3】 UITableViewのHeaderをカスタマイズする方法

今開発中のアプリでUITableViewのHeaderをイジる必要があって、いろいろ調べたのでメモ。

func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
 //code
}

ではなくて、viewForHeaderInSectionを使ってUIViewをリターンしてあげる。

func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
 let headerView:UIView = UIView()
 headerView.backgroundColor = UIColor.white
 return headerView
}

あとはこのViewにいろいろと追加していけば好みのものがつくれる。

headerの高さは、tableViewのメソッドで指定する。

tableView.sectionHeaderHeight = CGFloat()

仕事でコード書くと知らないことを知れるのでおもしろい。
いろいろと勉強になる。