ヴェポライザーでシャグ:Hi Tabacco バージニアブレンド

ついつい新しい味を求めてシャグ を買ってしまいます。今回は Hi Tabacco バージニアブレンドを買ってしまいました。

これよかったです。キック感があり、甘みがあり、そこそこ香りもよい。バージニアブレンドは今までキック感が感じられずどうかと思っていたのですが、考えが変わりました。パッケージもアルミの袋でジッパー付き。おまけのペーパーは薄いタイプのもので、よくわかっているな、という感じ。

気に入ったのでまた買おうと思いますが、新しいのも試してみたくなる。手持ちシャグ は今 5 袋あり、消費に努めないと・・・

Master-Detail template で Prototype Cells を変更する方法

Master-Detail template を使っていると、Prototype Cells というのが表示されて、あーここにセルの内容を表示するのね、というのはわかるのですが、変更しようとするともう大変。さっぱりやり方がわからない。色々調べたところ、次の通り。

  1. 1. Master の Table View を選ぶと Dynamic Prototypes というのが選ばれているので、このままで OK。
  2. Custom Cell を選んで、Style を見ると Basic になっているのでこれを変更し、Custom とする。この変更により、UILabel を配置できるようになり、元からある UILabel の大きさを変更できるようになる。

次にハマったのが、配置した UILabel に情報を表示しようとするとうまくいかない。tag の指定は 1 から順にしてやるとうまく行った。0 からにするとダメだった・・・

今までやり方わからなくて、別途に XIB ファイルを作ったりして対応していたので、むしろそっちの方がめんどくさいやり方で、こんな簡単な方法があるとは知らなかった・・・

また、瑣末な点ですが、配置した UILabel の Outlet を作ろうと、.h ファイルに引っ張ったら、storyboard にエラー表示。引っ張っちゃダメなんだね。

ランニング:パタゴニア、キャプリーンミッドウエイトと R1 の組合せ

先日セールでパタゴニアのキャプリーンミッドウエイトを買ったので、ランニングの時に試しています。

気温 10 度ぐらいの日にランニングしました。冬にしては暖かいのでキャプリーンミッドウエイトとウインドブレーカーだけで走ってみました。ちょっと寒い感じでした。

今日は、気温 2 度でとても寒い。キャプリーンミッドウエイトと R1 で走ってみました。全然寒くなくて、走っていると暑い。ミッドウエイトと R1 では暑すぎるなと。走り終わった後、わざと腕のあたりをポンポンやってみたら冷やっとしました。ま、汗かいているので当たり前といえば当たり前。こりゃ、ライトウエイトも欲しくなってきたなぁ。

ミッドウエイトとサーマルの組合せも先日やってみたのですが、丁度よかったですね。ただ、ぴっちりしすぎるので、ちょっと窮屈な感じはしました。

なんにせよ、冬のランニングは寒くて堪える、寒すぎてもう走りたくないと思えるほどなので、暖かい、暖かすぎない服装はとてもありがたいです。

ヴェポライザーでシャグ:Colts Smooth Taste

ヴェポライザーで Colts はハズレがないとの確信の元、pure なたばこ味を求めて、Colts Smooth Taste を購入してみた。nature は香りがすごく良くて、でも、キック感弱いかなーという感じだったので、Smooth taste に期待がかかるところ。

早速試してみたところ、んーー、しょっぱい?タバコ吸ってしょっぱい感じがしたのは初めてだったのですが、なぜしょっぱく感じるのかよくわかりません。でもしょっぱいのです。

キック感はそこそこあるものの、もうちょっと欲しいかなというところ。

また次の銘柄に期待です。

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

このネタで 4 回も書くとは思ってもいなかったのですが、より良い方法があったので、後学のため書いておこうと。

Master-Detail template に tabBarController を追加するのにどこに追加するのか?という問題があり、さらに、いい加減に追加しても、error になりまくるので萎えてしまうという悪循環。結局のところ、こうするのが一番だということがわかりました。

  1. Xcode で、Master-Detail template を選択。storyboard は自動的に作られているので、table view controller を選択し、メニューから Editor > embed in > Tab Bar Controller を選択すると、tabBarController が追加されます。storyboard はどうなっているかというと、split view controller - navigation controller - tab bar controller - table view とつながっています。また、detail では navigation が表示されています。繋ぎ方を間違えると、split view controller - master からの遷移では navigation が表示されず、detail からは表示されるという妙な状況に。どちらからも navigation が表示されることを確認します。
  2. tab bar controller を embed in した状態で、試しに build & run してみると error になります。原因は、AppDelegate.m に追加した tabBarController の記述が無いためです。error を回避するため、AppDelegate.m を次のように変更します:

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

    {

        // Override point for customization after application launch.

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

        UINavigationController *navigationController = [splitViewController.viewControllers lastObject];

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

        splitViewController.delegate = self;

     

        UINavigationController *masterNavigationController = splitViewController.viewControllers[0];

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

        

        UITabBarController* tabBarController = masterNavigationController.tabBarController.viewControllers[0];

        MasterViewController *controller = (MasterViewController *)tabBarController.viewControllers[0];

        

        controller.managedObjectContext = self.persistentContainer.viewContext;

        return YES;

    }

  3. 次に、この状態で試しに build & run してみると相変わらず error になります。かなり萎えます。原因は、MasterViewController.m で、managedObjectContext について教えてあげる必要があるためです。また、build & run に成功しても、navigation が表示されないため、navigation について考慮した記載にします。MasterViewController.m を次のように変更します:

    - (void)viewDidLoad

    {

        [super viewDidLoad];

        // Do any additional setup after loading the view, typically from a nib.

        self.tabBarController.navigationItem.leftBarButtonItem = self.editButtonItem;

     

        UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];

        self.tabBarController.navigationItem.rightBarButtonItem = addButton;

        self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];

        

        AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

        self.managedObjectContext = appDelegate.persistentContainer.viewContext;

        

    }

これで error にならず navigation も表示されるようになります。

tab をもう一枚追加するにはどうするのかとか、iPad で検証すると error になりそうな予感がしますが、躓くまでこれで進めてみることにしよう。

 

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

前回は storyboard の繋ぎ方について言及しました。今回は appDelegate.m と masterViewController.m の変更箇所について記載します。

appDelegate.m の変更箇所は、

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOption

method です。tabBarController を追加したのでそれを考慮した作りにします。具体的には次の通り:

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

    UINavigationController* navigationController = [splitViewController.viewControllers lastObject];

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

    splitViewController.delegate = self;

    UINavigationController *masterNavigationController = splitViewController.viewControllers[0];

    UITabBarController* tabBarController = navigationController.topViewController;

    MasterViewController *controller = (MasterViewController *)masterNavigationController.tabBarController.viewControllers;

    controller.managedObjectContext = self.persistentContainer.viewContext;

    return YES;

tabBarController が navigationController に従属して、masterViewController もそれに倣ってという形。

ここまで書いて build & run してみると error。かなり萎えます。次に、masterViewController.m を変更。変更箇所は次の通り:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Do any additional setup after loading the view, typically from a nib.

    self.tabBarController.navigationController.toolbarHidden = NO;

    self.tabBarController.navigationItem.leftBarButtonItem = self.editButtonItem;

    UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)];

    self.tabBarController.navigationItem.rightBarButtonItem = addButton;

    self.detailViewController = (DetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];    

    AppDelegate* appDelegate = [[UIApplication sharedApplication] delegate];

    self.managedObjectContext = appDelegate.persistentContainer.viewContext;

}

見逃しがちなのが、tabBarController.navigationController とするところで、これがないと detail で navigation が表示されなくなる。さらに、最後の appDelegate の指定がないと error になってしまうので、已を得ず記載。

これで error は回避できるし、navigation も表示されるようになるので、しばらくこれで進めてみよう。 

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

やっぱりハマりました。Master-Detail template で、rootView が splitViewController になり、そこに tabBarController を追加したくてしたくてたまらなかったのですが、オレオレでやってみたら detail に画面遷移した折に navigationBar が表示されない事態に・・・それを回避するためいろいろ試してみたものの、さっぱり改善しません。

detail に navigationBar が表示されないと何が問題なのかというと、detail に遷移した後 master に戻れなくなってしまうのが難点。色々試してみたところ、ようやく解決しました。

まず、viewController の繋ぎ方ですが、splitViewController - navigationViewController - tabBarController の順で繋ぎます。前回は、splitViewController - tabBarController - navigationController の順でつないでいて、storyboard で確認した時点で navigationBar が表示されなくなっていた。navigationViewController を先にすると、storyboard で見ても明らかに navigation が表示されているので、これが正解なんだなと。よくわからないのが、メニューから embed を選んだら tabBar が先に来てしまうので、手動で繋ぎ買えてやる必要がある点。

ゴールまでには道のりが遠く、その後、appDelegate.m や materViewController.m を変更する必要がありますが、眠くなって来たのでまた次回書きたいと思います。