iOS
個人開発で2023年5月末にiOSアプリをリリースしました! 英語日記でシャドーイングする英語勉強アプリphrasieYasuharu Yanamura教育無料apps.apple.com 有料アプリなので課金はしなくてもよいですが(してもいいですよ!)、星5をなにとぞお願いします!!!…
Xcode CloudがXcode 13.4.1から使えるようになったので試してみました。 Xcodeの左のナビゲーションの一番右の Report navigator もcloudタブからワークフローを作ることができるようになっています。 ここからXcode上でポチポチしていくだけで、ワークフロ…
UIKitのViewをSwiftUIとして使うには、UIViewRepresentableを使います。 そしてUIKitのViewのdelegateやtarget actionをハンドリングしたい場合structではハンドリングできないので、Coordinatorという仕組みが用意されています。 makeCoordinator()がmakeUI…
これはiOSアドベントカレンダー2021その3の25日目の記事です! SwiftUIのViewに対応するUIKitの参照をとってくるSwiftUI-Introspectという謎ライブラリがあります。 なんのことを言っているのかわからないと思うので例をあげると、SwiftUI-Introspectを使う…
iOSアプリのreleaseビルドを行った際にlinkerでinvalid bitcode versionで怒られることがあります。 ld: could not reparse object file in bitcode bundle: 'Invalid bitcode version (Producer: '1103.0.32.62.0_0' Reader: '1100.0.33.17_0')', using lib…
この記事はこの記事はコネヒト Advent Calendar 2019 18日目の記事です。 開発を重ねるとプロジェクト内についつい使っていないコードやリソースが残ってしまったり、開発環境にゴミが残ったりします。 今回はそれらの掃除に役立つツールを紹介します。 使っ…
Nimbleでtupleをequal()で比較してもコンパイルに通りません。 let tuple = (1, 2) expect(tuple).to(equal((1, 2))) 原因 これはtupleがEquatableではないからです 対策 これはどうしようもないので以下のようにequalを使わずに回避するしかなさそうです ex…
2019/6/28ころから急にAppStoreConnectにipaをアップロードするときに以下のエラーがでるようになった ERROR ITMS-90784: "Missing bundle name. The Info.plist key CFBundleName is missing or has an empty value in the bundle with bundle identifier '…
2019年3月27日からは6.5インチ用のスクリーンショットも必須になったようで、AppStoreConnectで申請時に設定しないと審査に出すときにエラーになるようになっていました。 iOS 12.2 SDKを含むXcode 10.2にアップデートして、Appをビルドしてください。2019年…
UIの追加 Xcode9までは右下に出ていたのが、Xcode10だと右上の方にあるボタン(○の中に□のボタン)を押すと出てくるようになりました。 Xcode9 Xcode10 Image Literal Xcode9だと画像名を入力すると補完されていましたが、Xcode10だとやり方が変わりました X…
横方向のStackViewを普通に使うと余白は詰められて横幅いっぱい使うようになってしまいますが、たまに左寄せにしたい(右に余白を開けたい)場合があります。 そんなときはこのように空のViewを一番うしろに突っ込んでやることで解決できます。 let spacerVi…
動機 RxSwiftのVariableがdeprecatedになったということで、その代わりとしてBehaviorRelayに置き換えようと思ったときに、BehaviorRelayに単純に置き換えてよいのか?BehaviorSubjectもあるけどこっちはどうなんだっけ?という視点で調べてみました。 結論 …
Togetter togetter.com 資料 speakerdeck.com speakerdeck.com speakerdeck.com speakerdeck.com WkWebViewのキャッシュについて調べた from firewood www.slideshare.net speakerdeck.com speakerdeck.com speakerdeck.com
Frameworkにはversionがいくつかあってそれらの違いの雑な説明です。 その1 ひとつはお馴染みのinfo.plistに書くやつ これはちょっと省きます その2 Umbrella Headerに書いてあるやつ FOUNDATION_EXPORT double FwVersionNumber; FOUNDATION_EXPORT const un…
InterfaceBuilderやStoryboardでAutolayoutを使って配置したViewをremoveFromSuperviewしてから、 再度addSubviewしたい!ということがたまにあります。 普通にremoveFromSuperviewしてaddSubviewすると元には戻りません。 なぜならremoveFromSuperviewした…
独自のNotification名を追加する場合はこんな書き方がよいような気がします。 extension Notification.Name { struct AppName { public static let DidLogin = Notification.Name(rawValue: "com.example.appname.didLogin") } } 通知名の文字列には通知名の…
ローカルではarchiveからipaにexportできるのにCircleCIだとExport Failedになる場合の対処法です。 原因としてはCircleCIの環境変数が悪さをしているようで、以下のをunsetすればなおりました unset BUNDLE_BIN_PATH unset BUNDLE_GEMFILE unset BUNDLE_ORI…
当たり前といえば当たり前なんですが、 iOSのKVO(addObserver(_:forKeyPath:options:context:))はObjective-CのNSObjectのメソッドなので、指定するkeyPathはObjective-Cのプロパティ名じゃないとだめです。 例えばUIViewのisHiddenをKVOしたい場合は↓のよう…
TwitterKitを使ってログインするときの注意点を2点 1. Twitterアカウントを登録しているかで挙動が変わる TwitterKitを使ってTwitterログインするときに、TwitterのアカウントをiOSに設定しているかどうかで挙動が変わります。 (2017年1月時点) iOSの設定…
Swiftにはweak reference arrayがないので、NSHashTableを利用します protocol SampleDelegate : class { func sampleDelegateDidFinish() } class SampleClass { let delegates = NSHashTable<AnyObject>() // AnyObjectをSampleDelegateにするとSwift3時点ではコンパ</anyobject>…
Xcode8.2でコマンドラインでシミュレータの動画が撮れるようになって便利に スクリーンショット xcrun simctl io booted screenshot. To take a video, run the command 動画 xcrun simctl io booted recordVideo <filename>.<file extension> 実行すると Recording... (Press CTL+C to</file></filename>…
現象が伝えにくいので、図に表すと以下のような感じで、 TabbarController内にNavigationControllerをもたせた状態で、いくつかViewControllerをPushViewControllerします。 そして、2つ以上PushViewControllerした状態で一番上のViewControllerのナビバーを…
Xcode8(Swift3.0.0)だと↓のテストは通るんですが、 import XCTest @testable import TypeTest class TypeTests: XCTestCase { func testType_WhenIntToAnyObject() { let intValue = ["hoge": Int(1) as AnyObject] XCTAssertTrue(intValue["hoge"] is Int) …
古 新 CGRectGetWidth( rect ) rect.width CGRectGetHeight( rect ) rect.height CGRectGetMinX( rect ) rect.minX CGRectGetMidX( rect ) rect.midX CGRectGetMaxX( rect ) rect.maxX CGRectGetMinY( rect ) rect.minY CGRectGetMidY( rect ) rect.midY CGR…
Xcode8でxcodebuildでtestを走らせると以下のようなエラーがでてテストが実行できなくなりました xcodebuild: error: Failed to build workspace XXX with scheme XXX. Reason: Could not determine bundle identifier for XXXTests's TEST_HOST: どうもTEST…
動画のフォトアルバムへの保存 iOS8まで import AssetsLibrary ... ALAssetsLibrary().writeVideoAtPathToSavedPhotosAlbum(filePathURL) { _ in // 完了後の処理 } iOS9以降 import Photos ... PHPhotoLibrary.sharedPhotoLibrary().performChanges( { PHAs…
セルのセパレーター消すやつ override func awakeFromNib() { separatorInset = UIEdgeInsets(top: 0, left: bounds.width, bottom: 0, right: 0) }
RxTableViewSectionedReloadDataSourceでは複数Sectionに対応できましたが、 Section単位でreloadData()がされてしまっていました。 今回はRxTableViewSectionedAnimatedDataSourceを使ってみます RxTableViewSectionedAnimatedDataSource ViewControllerはR…
rx_itemsWithCellIdentifierではSection1つしかダメでした。 複数Sectionを使う方法としていくつかあるっぽいのですが、 まずRXTableViewSectionedReloadDataSourceを使ってみます。 RXTableViewSectionedReloadDataSource これはRxSwiftには含まれておらず…
RxSwiftでTableViewとdatasourceをbindingさせる方法はいくつかあるようなので1つずつ見ていきます。 今回はrx_itemsWithCellIdentifilerを使ってみます。 rx_itemsWithCellIdentifier 単にSectionが1つのリストをTableViewに表示するだけであればrx_itemsWi…