WebView実装してリロードしまくったら出るNSURLErrorDomain エラー -999
前説
業務が忙しかったこともあり、色々ネタはありつつも書いてなかったので、落ち着いてきた今日あたりから徐々にまた書いていく。軽めにね。
NSURLErrorDomain エラー -999
WKWebViewを実装して特に制御せず、back
, forward
, reload
ボタンと処理を紐づけていたがため、reload
連打したらエラーなんか出たというバグ報告が上がった。
エラー内容は、
操作を完了できませんでした。(NSURLErrorDomain エラー -999。)
特にパッとなんでこのエラーが出たのか説明できなかったので、改めて調べた。
これは、発行したリクエストをキャンセルした際に返るエラーとのことで、reload
連打によりリクエストがキャンセルされてエラーとして返ってきてるために出ているものと判明。
ちなみにerror codeは、NSURLErrorCanceled
として定義されている。
NSURLErrorCancelled - Foundation | Apple Developer Documentation
UIBarButtonItemで画像の見たを変えずに使用するやり方
UIBarButtonItem
UIBarButtonItemは、UINavigationControllerとかと併せてよく使うButtonですが、そのまま使用すると下記のように透過じゃない部分は単色でTint Color
によって塗りつぶされます。
この画像を使用すると…
こうなる
これを画像を加工せずそのまま表示したいと思ったので、いいやり方ないか調べた際のメモです。
init(customView:)を使う
UIBarButtonIteminit(customView:)
という初期化方法にUIButtonを設定することで簡単に実現できる。
流れとしては、
- Storyboardで、UIButtonを用意する
- IBOutletで紐づける
- そのButtonを使用してコードでUIBarButtonItemを作成する
- UIBarButtonItemをセットする
そうすると、このようになる、
このやり方のメリットとして、StoryboardのUIButtonからIBActionを設定できるのでaddTarget
とかを使って#selector
で押下時の挙動を設定してあげる必要がない。
Storyboardを使わない場合
この場合、コードでUIButtonを生成して同じようにUIBarButtonIteminit(customView:)
でセットしてあげればよい。
AutoLayoutでmarginを画面比率によって変更したい時の対処
経緯
ふと前にも調べた気がするが、覚えていないなら覚えるまで同じ記事であろうか書くしかない。
AutoLayoutで制約をつけていると、固定のものは問題ないが、画面サイズによって可変にしたい場合、Viewのwidth
やheight
であれば、superviewとequal widthやequal heightしてから、割合で入力してやれば簡単にできるので困らない。
一方で、safeAreaのtopからのmarginとなると素直にやる方法がなくて困る。
UINavigationBarがないStoryboardなら使える方法
ものによっては、Vertically in Container
をつけて調整することで対応できるものもある。(具体的に言えば、UINavigationBarの影響がないStoryboard、LaunchScreen等)
ただ、これも万能ではなく、Storyboard上で上手く作れた様に見えて、実機で確認するとstatusBarやNavigationBarの高さが余分に含まれた見た目になることがある。
Storyboardを捨てるかどうか
marginを画面サイズから割合で出す方法は2つある。
1. Storyboardを使わない場合
UILayoutGuide
というものがあるので、これを使いましょう。
詳しくはこちら
Goodbye Spacer Views Hello Layout Guides
2. Storyboardを使う場合
これは、もう色々諦めの境地で空のUIViewをSpacerとして配置しましょう。
ViewとView、safeAreaとViewの間に置き、TopやBottom等を0marginでくっつけ、SpacerのViewのwidth
やheight
をsuperviewとの割合で調整します。調整が終わったら、hidden
にチェックをつけ、画面から見えないようにします。
これは意味もなくViewを置く無駄加減にモヤっとしますが、他に方法がないです。
UILayoutGuide
がInterface Builderに対応してくれれば、可能ですが、Xcode9の時点では無理です。(Xcode7時代からずっと今まで無理)
NavigationItemのLeftBarButtonItemsにitemを入れるとBackボタンが表示されなくなるやつの対処
経緯
割と当たり前だったりすることでも、知らないことも多々あるので、今回そんな例として今更知った内容のメモとして記載
内容
UINavigationControllerから pushViewController(UIViewController, animated: Bool)
で次のViewControllerに遷移するのは珍しくない。
しかし、遷移先のViewControllerのUINavigationItemのLeftBarButtonItemsにItemが入っていると、NavigationBarにBackButtonが表示されず、画面を戻ることができない事態に遭遇する。
その解消方法をメモ程度のつもりで記載
本来であれば、このようにBackButtonが表示される。
しかし、下記のような作りをしていると…
VC2に遷移した時BackButtonが出ない。
対処方法
対処は簡単。
StoryboardでUINavigationItemの Left Items Supplement
にチェックをつける。
または、コードで leftItemsSupplementBackButton
を true
にする。
self.navigationItem.leftItemsSupplementBackButton = true
そうすることで、LeftBarButtonItemsとBackButtonが共存するようになる。
2018年の目標
(遅くなりましたが)あけましておめでとうございます
年が明けて早半月程経ち、そろそろ今年の目標を決めておかないと思い、本年1 発目のブログを書いている。
2017年の目標の反省
まず去年(2017年)の反省もしていないので、先にそっちから。 目標は3つ立てていたみたいだけど、途中から忘れてました。
- はてなブログをもう少し細かく書く(目指せ週1ペース) [通年]
これは見事に出来てません。 原因は、怠惰な面が出た結果かなと。記事にしようとメモは毎日のように貯めているものの、それを記事にしようとした時に時間がかかるので、放置してしまっているがため。
2017年の記事数は36件なので、36/52で69.2%の達成具合で、プラスに捉えるなら2週に1回のペースでは書いている。もう一息ってところだろうか。
- 組織からの脱退 [目標: 6月中まで]
これは達成!
時期としては6月中とはいかなかったものの、2017年内には退職して憎っくき組織から脱出成功したので、良かったかなと思います。
- 引っ越し [目標: 物件状態によるが3月中若しくは6月中まで]
これも達成!
思い立ったが吉日で、1月末から探して、2月の頭には物件決めて、引っ越しも2月中に完了した。
2018年の目標
2017年の反省も踏まえつつ、2018年の目標を考える
1. はてなブログを週1ペースを目指して書く [目標: 通年]
去年は達成できていないし、書く習慣付けをしたいところでもあるので、同じ目標を設定
2. 組織からの脱退 [目標: 上半期まで]
これまた、同じ目標。
2017年まで属していた企業は、とにかく業務以外の部分が酷く関わりたくない、いてもろくなことにならないし、薄給すぎる。といった不満で辞めると考えていた。
今回は、そこまでネガティブな話ではない。
iOSエンジニアとして働いているが、スマホ界隈は流れが早く毎年新しい話題が出てくる(特にSwiftやiOSと毎年アップデートされることもあって)。
今所属している企業は、企業体質としては悪くないし、賃金も年相応にはもらっているため大きな不満はない。ただ、業務面ではどうしてもレガシーなままで職業として業界と会社のギャップがどんどん開いていることに耐え難いと感じている。
所属している期間が伸びれば伸びるほど、そのギャップも日増しで、ストレスとして感じしまうため、ギャップの少ない働き方を目指したいと思い、結論として会社を辞めようと考えた。
辞めた際は、フリーランスで希望に近いところで働いていこうと考えている。
3. 引っ越し [目標: 年内]
これまた同じ目標
2017年引っ越して、以下の点で満足していた。
- 部屋が広くなった
- ウォシュレットがついた
- 独立洗面台がついた
- 風呂とトイレが別になった
一方で引っ越して不満として以下のものが出た。
- 隣の部屋で移動販売用の食べ物を仕込むため、Gが自分の部屋に流れ込んでくる(月1はあたりまえ、酷いと特大サイズが2匹同時に)
- 隣の部屋が食べ物を仕込むため、朝4時から動き出し、ドタバタ音を立てて五月蝿い
- 上の階の部屋が深夜1時くらいに帰宅して酷い足音で動き回り五月蝿い
- たまにアパートの住人の車でマフラー改造したのか暴走族並みに五月蝿い車を止める
- スーパーと薬局とコンビニが遠くなり買い物が不便になった
- 引っ越したことでヤマトの再配達がギリギリ間に合う様になった後、再配達時間の見直しにより間に合わなくなった
隣人騒音やGの出現が理由で引っ越してきたはずが、結局改善されないどころか一部悪化している。
家賃自体は前より2万も高くなったのにメリットが薄く、Gと戦うのがきついので出来れば引っ越したいと考えている。
4. LTを行う [目標: 2ヶ月に1回程度]
ブログを書き、外にわずかながら情報発信しはじめたので、次のステップとして人前で話し、伝えることに慣れていこうと考えた。最終的には技術本を書くとかtry SwiftやiOSDCでの登壇を目標としていきたい。
この取り組み自体は去年の10月から始め、今のところ10月と12月に発表はしている。
5. アプリの作成と配信 [目標: 通年]
業務だけではブログやLTのネタは十分なほど貯まらないと感じている。
また、普段アプリを使用していて不満はそれなりに感じたり、もっとこういう機能欲しいと思うことがあるので、ネタ帳に書いている。それらを肥やしにするのはもったいないので、作っていこう(マネタイズも考えているのであわよくばお金稼ぎたい)と考えている。
今のところ想定として、下記アプリで、「1.」ともう1つどれかを作るまでが目標。
6. その他
技術系の目標としては以下。上から順に優先度高めで、必ずしも全部達成しようというわけではなく、自分に必要だと思う部分、興味ある部分を設定しているので努力目標。