SwiftのUIViewController間でデータを受け渡す話
おはようございます、かびさん@あおかびんです。
iPhoneアプリをSwiftを使って開発しているのですが
UIViewController間でデータを渡したいときに
AppDelegate.swiftに変数を追加すると渡せるということだったので
その方法を記述したいと思います。
1.AppDelegate.swift
AppDelegate.swiftファイルの中に、値を保持する領域を宣言します。
具体的には、
class AppDelegate: UIResponder, UIApplicationDelegate { var message: String? ・・・ }
こんな感じですかね。
2.SendViewController.swif (受け渡しView)
値に書き込むためにはAppDelegateクラスの変数を用意して、
その変数のクラス変数(?)を経由して書き込む形になります。
class SendViewController: UIViewController { var delegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate ・・・ // ボタンを押したときの処理 func touchButton(sender: UIButton){ // AppDelegateのmessageに押されたボタンのtagを代入 self.delegate.message = String(sender.tag) // NavigationControllerを使ったページの遷移 let receiveViewController: ReceiveViewController = ReceiveViewController() self.navigationController?.pushViewController(receiveViewController, animated: true) } }
こんな感じで記述しました。
(今回NavigationControllerを使っているので、ちょっとややこしいかもしれない)
3.ReceiveViewController.swift (値の受け取りView)
class ReceiveViewController: UIViewController { var delegate:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate override func viewDidLoad() { super.viewDidLoad() println(self.delegate.message) } ・・・ }
2と同じように呼び出しを行って、値を吐き出しています。
多分うまくいくんじゃないかな
ダメだったら連絡ください、修正します。。。
これを知らなかったからViewのinitをoverrideしようと苦戦してた。。。
スキル無さすぎダメダメのダメ。
すみません、以上あおかびんでした。
学校の課題を解くためにHaskellを使った話
こんにちは、かびさん@あおかびんです。
学校の課題で、ちょっとした計算問題を解くときに
普通に解くのが面倒くさいなーと思って
前まではPythonの対話を使って計算をしていたのですが、
この間確率統計のときに
先生「100万の中から1万個取り出す組み合わせはやろうと思ってもできない」
という発言があり(実際にはマクローリン展開かなんか使えばできるみたいな解説のため)
「できそう」と思ってしまったが故にPythonで書こうとしたら案の定計算できない。
また、3の20乗を計算する問題が出て、
計算するのにわざわざコード書くのも面倒だなと。
そこでHaskellを導入してやりました。その手順を書きます。
1. Haskell PlatformのDLとインストール
こちら、Haskell Platformの公式DLサイトよりHaskell PlatformをDLします。
ちなみに、brewを使わないのは
Haskell関係のパッケージ(?)をインストールするcabalが
brewだとうまく動いてくれないので、こちらのHaskell Platformを使います。
あとはDLしたpkgを開いてインストールしてください。
2.ターミナルでhaskellの対話シェルを起動する。
インストールが終わったら対話形式でhaskellを実行してみましょう。
コマンドラインで
ghci
と入力すると、最初の激重initの後haskellのインタラクティブシェルが起動します。
閉じるときは
:q
コマンドを入力すれば大丈夫。
(発展)3.100万から1万個を取り出す組み合わせ問題を解かせる。
適当なエディタを使って、test.hsに次のソースコードを書き込んで保存しましょう。
手元にファイルがなかったので、後で追記します。
(発展)4.分数の累乗とかを求めてみる。
haskell先輩は分数も扱うことができます。ありがたいですね!
ghciを起動したら、次のコードを入力してください。
import Data.Ratio
すると、%区切りで分数を扱うことができます。
1 % 3 * 1 % 4 -- 3分の1 × 4分の1 1 % 12 -- 12分の1
また、このまま累乗も計算できる。
((1 % 3) * (1 % 4)) ^ 20 -- (3分の1 × 4分の1)の20乗 1 % 3833759992447475122176 -- おおきなかず分の1
簡単な数式を入れるときはhaskellを使うようになりました。
すごく便利なghciでしたね。
以上、あおかびんでした。
SwiftのUIButtonで画面遷移をする話
こんばんは、かびんさん@あおかびんです。
今日はSwiftのUIButtonで画面遷移を行ったので
それをメモ書きします。
override func viewDidLoad() { super.viewDidLoad() self.view.backgroundColor = backgroundColor for i in 0...2 { let task: UIButton = UIButton() let icast:CGFloat = CGFloat(i - 1) let action: Selector = Selector("touchButton" + String(i) + ":") task.backgroundColor = UIColor.whiteColor() task.layer.masksToBounds = true task.setTitle("task" + String(i), forState: UIControlState.Normal) task.setTitleColor(UIColor.blackColor(), forState: .Normal) task.addTarget(self, action: action, forControlEvents: .TouchUpInside) task.layer.masksToBounds = true task.frame = CGRectMake(width / 2 - fieldWidth / 2, height / 2 - fieldHeight + (40.0 * icast), fieldWidth, fieldHeight) self.view.addSubview(task) } } internal func touchButton0(sender: UIButton){ // 遷移するViewを定義する. let editViewController: TaskEditViewController = TaskEditViewController(i: 0) editViewController.modalTransitionStyle = UIModalTransitionStyle.CoverVertical self.presentViewController(editViewController, animated: true, completion: nil) }
タッチイベントを取得したらその名前のセレクタが実行されるという形式。
UITextfieldのデザインを調整したいんだよな・・・。
以上あおかびんでした。
Slackにてhubotで会話監視を導入した話
こんにちは、かびさん@あおかびんです。
今回はSlackすごく便利ですよね、よく使っています。
Slackのgeneralチャンネルを全体報告の連絡のみに絞るため
@channelが付いていない発言には小言を言うbotを作りました。
ソースコードはこんな感じ。
attention.coffee
module.exports = (robot) -> robot.hear /(.*)/i, (msg) -> if ///^@channel: ///i.test(msg.match[1]) return else msg.send "<君ぃ・・・連絡事項は文頭に@channel: をつけないとダメじゃないか。それ以外の話は #random でやりたまえ。"
ちょっとウザみのあるbotに仕上げました。
ただ、先頭からしか@channelを検知しないのと、
ファイルのアップロードとかには対応できていないのが現状です。
誰かいい方法を教えてください。
以上、あおかびんでした。
画像処理ライブラリRCairoをインストールした話
こんにちは、かびさん@あおかびんです。
PCをお引越ししたので、まえのPCに入っていた設定が使えなくなりました。
学校の課題(?)で画像を自動生成するためにRCairoというツールを使っていたのですが
引越しで使えなくなったので、再インストールすることにしました。
以下が手順です。
まず、xquartzをインストールする必要があるので、brewでインストールします。
brew install Caskroom/cask/xquartz
その後、brewでcairoをインストールします。
brew install cairo
そして最後にGemでcairoをインストールします。
sudo gem install cairo
これでRCairoが使えると思うので、
rcairoサイトで提供しているhinomaru.rbをコピーして使ってみましょう。
require 'cairo' format = Cairo::FORMAT_ARGB32 width = 300 height = 200 radius = height / 3 # 半径 surface = Cairo::ImageSurface.new(format, width, height) context = Cairo::Context.new(surface) # 背景 context.set_source_rgb(1, 1, 1) # 白 context.rectangle(0, 0, width, height) context.fill # 赤丸 context.set_source_rgb(1, 0, 0) # 赤 context.arc(width / 2, height / 2, radius, 0, 2 * Math::PI) context.fill surface.write_to_png("hinomaru.png")
ファイルを保存したら、
ruby hinomaru.rb | open hinomaru.png
で実行後に日の丸画像が開いたらOK!
rcairoは気軽に画像扱えるからいいですよね、僕のPCだと重かったけど。
以上、あおかびんでした。
C言語で探索用のランダムな数列を作った話
こんばんは、かびさん@あおかびんです。
学校の課題で並列分散処理を行うために、
数列の探索をしようという話になりました。
そのために、100万のランダムな数列を作り出す必要があったので
その数列を最初にNode.jsで書こうと思ったらすごく遅い・・・。
アルゴリズムが良くないのかもしれませんが、5時間かかっても終わりませんでした。
そこでC言語で100万のランダムな数列を作ったらすぐ終わったので
その方法を書いておきたいと思います。
#include <stdio.h> #include <stdlib.h> #include <time.h> #define N 1000000 void shuffle(int ary[], int size); int main(void) { int i = 0; int j = 0; int arr[N]; int shf[N]; int index; int length = 0; srand((unsigned)time(NULL)); for(i = 0; i < N; i++) { arr[i] = i; } shuffle(arr, N); for(i = 0; i < N; i++) { printf("%d\n", arr[i]); } return (0); } void shuffle(int ary[], int size) { int i; for(i = 0; i < size; i++) { int j = rand()%size; int t = ary[i]; ary[i] = ary[j]; ary[j] = t; } }
shuffle関数の中で、
先頭から順にランダムな位置にある数字とスワップしている感じですね。
400万でやろうとしたら、スタック領域が足りず、実行できませんでした。。。
何かいい解決方法があるといいんですが。。。
ちなみに標準出力をcsvファイルに書き込むと、改行でわかれたデータを書き込めます。
以上、あおかびんでした。