flyingbirdのiPhoneアプリ開発記録

- PolyRhythmの中の人がiPhoneアプリ開発中に思ったことを記録するブログです -

【Swift】AVAudioPlayerのinitializeでエラー!?

  • AVAudioPlayerを使ってmp3を再生しようと実装をした時にハマったこと・・・
    • 以下のソースの様にAVAudioPlayerをイニシャライズしようとすると、何故かその行でブレイクしてしまう・・・何かの例外はキャッチして止まっているようだが、何も情報が出ない・・・。にもかかわらず、ステップアウトしていくと、クラッシュするでもなくそのまま処理が進んでってしまう。なんじゃこれは。。。
AVAudioPlayer(data: data, fileTypeHint: AVFileTypeMPEGLayer3)


  • これでいいのか!?
    • ググってもなかなか解決策が見当たらなかったのだが、ようやく以下のリンク先にあるやり方で解決。例外が発生すると、そこで自動的にブレイクする設定にしていたのだが、その例外の種類を全開にしていると起こるようだ。。。「All」から「Objective-C」に変えたら確かに起こらなくなった。以下のリンク参照

stackoverflow.com

【Swift】UIToolbarをキーボードと一緒に上げ下げしたい

画面の下に張り付いているUIToolbar… こいつを画面下から現れるキーボードと一緒に上げ下げしたい!!

  • ようやく答えを見つけた。以下のリンクを参照してなんとか解決。

stackoverflow.com

  • リンク先はconstraintsの参照をViewControllerにもたせていたが、identifier使って取ってみた
	@objc private func keyboardWillShow(_ notification: Notification) {
		let frame = notification.userInfo![UIKeyboardFrameEndUserInfoKey] as! NSValue
		let height = frame.cgRectValue.height
		let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double

		UIView.animate(withDuration: duration) {
			super.view.constraints.first(where: { (constraint) -> Bool in
				return constraint.identifier == "toolBar"
			})!.constant = height
			super.view.layoutIfNeeded()
		}
	}

	@objc private func keyboardWillHide(_ notification: Notification) {
		let duration = notification.userInfo![UIKeyboardAnimationDurationUserInfoKey] as! Double

		UIView.animate(withDuration: duration) { 
			super.view.constraints.first(where: { (constraint) -> Bool in
				return constraint.identifier == "toolBar"
			})!.constant = 0
			super.view.layoutIfNeeded()
		}
	}

【Swift】複数のUITextFieldを1つのUITextFieldDelegateで扱う時の話

  • 下記の事をやったときに、どのUITextFieldを操作しても同じDelegateメソッドが発火してしまう。DelegateメソッドのパラメータにUITextFieldが渡ってくるのだが、配置したUITextFieldのどれでDelegateが発火したかどうやって判断するのが良いのか?
    1. ViewControllerに複数のUITextFieldを配置
    2. UITextFieldのdelegateをそのViewControllerに接続
    3. ViewControllerでUITextFieldDelegateをimplements


  • UITextFieldにtagを付けて、パラメータで渡ってきたUITextFieldのtagで判断する
  • UITextFieldを@IBOutletで参照し、その参照とパラメータが同じかどうかで判断する

どっちかな〜〜

stackoverflow.com
iphonedevsdk.com

フィラメントLED

・さて、どれがLEDでしょうか?f:id:flyingbird69:20170208012056j:image

まさかこんなLEDの電球があるとは思わなかった。答えは一番左端の奴がLED。これ全然わかんないでしょ。LEDの右隣が10Wの白熱電球。で、更にその右隣が25Wの白熱電球。LEDなのに全く違和感なし。これなら全部LEDにしちゃっても問題ないな。

 

 

Swiftでバーコードを読もうとした時のエラー

バーコードでエラー

  • Swiftでバーコードを読んでみようと、ちょっとやってみた。
    すると、以下のエラーに出くわした。
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[AVCaptureMetadataOutput setMetadataObjectTypes:] Unsupported type found - use -availableMetadataObjectTypes'


正誤表

どうも、処理の順番がマズってたみたいだ

let aVCaptureMetadataOutput = AVCaptureMetadataOutput()	
aVCaptureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
aVCaptureSession!.addOutput(aVCaptureMetadataOutput)
aVCaptureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code]
let aVCaptureMetadataOutput = AVCaptureMetadataOutput()	
aVCaptureMetadataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main)
aVCaptureMetadataOutput.metadataObjectTypes = [AVMetadataObjectTypeEAN13Code, AVMetadataObjectTypeEAN8Code]
aVCaptureSession!.addOutput(aVCaptureMetadataOutput)

何が問題かって言うと、「metadataObjectTypes」に値を設定するタイミング・・・
SessionにaddOutputした後、じゃないと駄目みたい。

TwitterApiのカンマ・・・

TwitterApiを叩くとき・・・
例えば、ttps://api.twitter.com/1.1/users/lookup.jsonとか。
クエリにuser_id=xxx,xxx,xxx,xxxとかくっつけるんだけど、
URLエンコードする際にちょっとした癖が・・・
通常カンマ","は"%2C"にエンコードすれば良いのだが、
oauth_signatureを作るときのエンコードは"%252C"である必要があるっぽい。
Objective-Cの場合はCFURLCreateStringByAddingPercentEscapesで
2回エンコードを書けるとそれになってたっぽい。
SwiftでaddingPercentEncodingを使った時は2回エンコードかけても、
"%2C"のまま。当然だけど。。。
そもそもまぐれでうまく行ってたっぽい。
なにこれ・・・