パタゴニアのセール

パタゴニアのセールに行ってきた。ここ、日本では結構強気で、ほとんど値引きなしで販売するアウトドアブランド。セールは通常年 2 回しかなくて、8 月、2 月が通例。しかも、値引率がかなりしょぼくて 20% Off ぐらい。Web アウトレットを小まめにみていると掘り出し物も見つかるでしょうが、予告なしで特価品が出るのでこまめにみるほど暇ではないので、自然と店舗のセールの時に買うことになる。

今回狙っていたのは、キャプリーンミッドウエイト。キャプリーンはサーマルウエイトを持っていて、冬のランニングの時に重宝していて、素晴らしいのは分かっていたのだけれど、サーマルの下に何を着るのか悩みがち。R1 も持っているのですが、同じく、ベースとなる肌着は何を着ればよいのかいつも悩んでしまいます。どうやらキャプリーンのライトウエイトかミッドウエイトだと、丁度よい感じがしていたのですが、高額すぎて普段は買えないので、セールの折に買ってしまおうと。ライトとミッドは悩みましたが、最近寒いのでミッドにしておこうと。

実店舗でのセール初日に仕事帰りに寄ったところ、すでに満員状態で、改めて人気なんだと再認識。肝心のミッドウエイトはどこだと探したら、値引きしていない・・・なんだよこれ、と思ったらありました、値引きしたのが。色によって、値引きするものしないものがあるようで、オリーブ色のは値引き、グレーや黒は値引きなしという状況でした。相変わらずセコいというか、潔さがないというか、セールの看板降ろせよと思いました。

ベースレイヤーなので、色はなんでもよいので値引きしたオリーブの買いました。レジでも結構イラっとすることが・・・まず、袋は有料で ¥100 だって。エコを意識しているんでしょうかね、それにしても ¥100 は高いだろ。いらないと言ってそのままカバンに放り込んでやったよ。なんか、古着を買っている気分だったね。あと、店員がすごい横柄というか、髭面は、まぁ、許すとしても言い方気をつけろよって感じ。売ってやるからさ、みたいで印象悪かったです。

家に帰ってから早速着てみました。やっぱいいね。暑くないんだけど寒くないという、絶妙な着心地。製品はいいのにね、売り方に共感できない、荒さしか見えないのは、ちょっと残念な感じです。この店舗だからか?店変えればいいのかな。

 

Master-Detail template で tabBarController を追加する方法

久しぶりにはまりました。Master-Detail template はよく出来ていて、手を入れる必要がある個所が分かってくれば凄く便利なんです。

でも、TabBar を追加しようとすると状況が一変してしまう。まず、TabBar の追加の仕方がわからない。さらに、storyboard に追加しても build すると error 発生で萎える。一週間ぐらい悩んで、ようやく error にならないようになりました。備忘のため手順を記しておこうと思います。

  1. テンプレートでは、Master-Detail App を選択します。Use CoreData のチェックを入れることを忘れないようにします。
  2. Main.storyboard を開きます。UISplitViewController が Storyboard Entry Point になっていますが、そのままで大丈夫です。UITabBarController を追加するため、Master の navigation controller を選択します。UISplitViewController からは 2 つの segue が設定されていますが、Master の方を選択します。
  3. メニューから、Editor > Embed in > Tab Bar Controller を選択します。余談ですが、UISplitViewController を選択した状態でこのメニューは選べませんので安心です。メニューを選択すると、UITabBarController が追加されます。
  4. splitView から detail に relationship が設定されているのでこれを削除します。削除する理由は error になるからなのですが、回避方法がわからないのでひとまず削除します。
  5. 試しにこの状態で build してみます。build は success となりますが、simulator ではアプリ起動直後に error になります。error の原因は色々ありますが、tabBar を追加したので、topViewController の指定が適切ではないためです(ということがようやく分かりました)。なので、適切に指定するように template の内容を変更します。
  6. AppDelegate.m を変更します。tabBarController を追加したので、topViewController の指定を変更します。正直、正しいのかさっぱり分かりませんが、変更箇所は以下の通り。

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

        // Override point for customization after application launch.

        UISplitViewController *splitViewController = (UISplitViewController *)self.window.rootViewController;

        UITabBarController* tabBarController = [splitViewController.viewControllers lastObject];

        UINavigationController *navigationController = tabBarController.viewControllers[0];

        navigationController.topViewController.navigationItem.leftBarButtonItem = splitViewController.displayModeButtonItem;

        splitViewController.delegate = self;

        UINavigationController *masterNavigationController = tabBarController.viewControllers[0];

        MasterViewController *controller = (MasterViewController *)masterNavigationController.topViewController;

        controller.managedObjectContext = self.persistentContainer.viewContext;

     

        return YES;

    }

  7. 試しにここで build & run してみると、エラーになります。理由は、Master の ViewController を表示しようとした時に、tabBarController を追加したことを加味していないためです。MasterViewController.m の viewDidLoad method を変更します。変更箇所は次の通りです。
    変更前
       
    self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
    変更後
      
    self.detailViewController = (DetailViewController *)[[self.tabBarController.viewControllers lastObject] topViewController];

とりあえずこれで build & run しても error にならなくなります。storyboard の detail relation をカットしてしまったので、iPad の動作検証で問題になる可能性大ですが、error にならなくなったのは精神衛生上非常によいことで、躓くまではしばらくこのまま進めてみよう。

 

ヴェポライザーでシャグ:Bali Shag 赤

ヴェポライザーで shag、色々 shag を試しているものの、メンソールとか香りのついていない普通のタバコ味で吸いごたえのある shag はないのか色々試していますが、なかなかいいのが見つからない。

そんな中、昨日買ってきた Bali Shag 赤はかなりよい。吸いごたえありすぎ。正直、くらっときた。これいいね。いつもより少なめにしないときつくて吸えないレベル。

これだと、青、緑も試したくなってくるね。

オレオレ Shag ランキング

1. Colts Clear Menthol

2. Bali Shag rounded golden versinia

3. Stanley Ice Mint

4. Colts Nature

 

UITextField で表示するキーボードは Storyboard で設定できる

UITextField で表示する keyboard は、code から設定するものだとばかり思っていたのですが、Storyboard からも設定できることを今日知った・・・

UITextField を選択し、Show the Attributes Inspector を選択、Text Input Traits の中に、Keyboard Type という list があり、keyboard を指定できる。

せっかくなので、この方法でしばらくやってみよう。

ちなみに、keyboard type を number pad にして、数字の keyboard を出せば、数字しか入力できないのかと思ったら、そう甘くはない。copy & paste すると相変わらず alphabet も paste できてしまうので、入力文字制限のための delegate method で別途に書かないとならない。

 

navigationController の delegate method

Detail から detailDetail に画面遷移し、navigation ボタンで Detail に戻ってくる時 delegate method はないのか? 事の発端は、戻ってきたとき tableView の内容が更新されない事態で困ったなと。

調べてみたらちゃんとあった。Detail に戻ってきた後に呼ばれる method は以下の通り。

- (void) navigationController:(UINavigationController *) navigationController

        didShowViewController:(UIViewController *) viewController

                     animated:(BOOL)animated

Detail の class で <UINavigationControllerDelegate> を宣言し、

viewDidLoad あたりで self.navigtionController.delegate = self; とし、

上記 method を実装すると呼ばれる。

便利だね。

Segue の kind で指定できる内容の違い

Segue 接続して次の画面に遷移する場合ですが、Attributes Inspector を表示すると、kind とというリストがあり、そこで画面をどのように表示するか指定できる。

遷移したら navigation Item が表示されなくなったぞ?と思っていたら、Show あるいは Show Dtail を指定しないとならないのに、Present (series) を選んでいたことが原因だったということが分かりました。

ところで、Show と Show Detail の違いは一体何なのだ?という新たな疑問が生まれました。どちらを指定しても、動作的には変わらないのですが?遷移する時、例えば、一方が左から右、一方は下から上のように分かりやすい形だと良かったのですが、そうではないので一層???

調べてみたところ、iPhone では画面が小さいのでどちらも同じ動作になりますが、iPad の場合、split view のように分割して画面提示する形を考慮すると、一方にリスト、一方に detail を表示するような提示の仕方ができるのが Show Detail ということが分かりました。

なるほど、と。iPad での検証は少し先なのですが、今はとりあえず、Show Detail にしておこう。

UISwitch の反転

UISwitch の変更があった場合、値をどうやって設定するか。現在の値は property on で取得できます。mySwitch.on のような形です。現在の値を取得できることから、if 文で分岐するやり方を思いついたのですが、あまりスマートではないなぁと・・・こんな感じ。

if ( mySwitch.on )

{

    mySwitch.on = NO;

}

else

{

    mySwitch.on = YES;

}

よい方法はないかと調べたら、こんなやり方があった。

mySwitch.on = !mySwitch.on;

これいいね。