WPTouchでモバイルテーマ(iPhone用のテーマ)に戻すボタンが表示されない場合


使用しているPCのテーマによっては「WPTouch」のモバイルテーマ(iPhone用のテーマ)に戻すボタンが表示されない場合があります。

原因としては、使用しているテーマのスタイルシートが原因な事がほとんどですが、

ダウンロードして来て使用しているテーマだとスタイルシートに大改修はなるべく入れたくないと思うのが当然です。

その時の対処方法を以下に記述します。

原因1:「wp_footer」がfooter.phpで呼ばれていない

「WPTouch」のモバイルテーマへの切り替えボタンは

// モバイルテーマの追加
add_action( 'wp_footer', 'wptouch_switch' );

という風に、wp_footerへのアクションフックで実装されています。

なので「wp_footer」が存在しないと表示処理自体が実行されないので、「wp_footer」をcallするようにしましょう。

原因2:スタイルシートのx-indexや、positionの設定により思った位置に表示されない

HTML上は書き出されているが、他のタグの後ろに隠れていたり、思った箇所と異なる箇所に表示される場合の対処です。

モバイルテーマの表示用の関数は「wptouch_switch」と言う名前で実装されています。

なので、直接表示したい箇所で呼び出しましょう、また

アクションフックに登録されているので、アクションフックが動作する前に対象のアクションフックを削除も行うようにします。

表示したい場所で以下の記述を追加します。

<?php
if (function_exists('wptouch_switch')) {
	wptouch_switch();
	remove_action( 'wp_footer', 'wptouch_switch' );
}
?>

「remove_action」の呼び出しは、「wp_footer」を呼び出す前に実行される箇所に記述するようにしてください。

(今回は、記述箇所が「wp_footer」前だったので同じタイミング実行しています。

これで、以下のようになり

モバイルテーマに戻す為のボタンが表示されるようになります。

 

参考にしたサイト

  1. WPtouchでiPhone用テーマに戻すには?
  2. WPtouchでiPhone用テーマへの表示ができない(使えない)場合の対処方法

iPhoneアプリのUIButtonでチェックボックスを実装する方法


 

iPhoneアプリのデフォルトのUIではAndroidやHTMLで実現出来るチェックボックスのようなものがありません。

ですので、UIButtonを使用してチェックボックスを作って実現してみました。

用意するもの

  1. チェックボックス用の画像
  2. UIButtonを継承したサブクラスの実装

この2つで実装できます。

まず、画像はAndroidで表示されるチェックボックスの画像を切りだして作成しました。

  

この3つの画像を使用します。

1.UIButtonのサブクラスを作成する

  1. メニューの「File」 →「New」→「File」をクリックして「Choose a template for your new file」を表示します。

  2. 「Next」ボタンを押下して、Class名に「CheckboxButton」Subclass of に「UIButton」を入力して「Next」ボタンを押下する
  3. 「CheckboxButton.h」を編集
    #import <UIKit/UIKit.h>
    
    @interface CheckboxButton : UIButton
    
    @property (nonatomic, assign) BOOL checkBoxSelected;
    
    @end
  4. 「CheckboxButton.m」を編集する
    #import "CheckboxButton.h"
    
    @implementation CheckboxButton
    
    @synthesize checkBoxSelected = _checkBoxSelected;
    
    - (void)awakeFromNib
    {
        [super awakeFromNib];
        UIImage* nocheck = [UIImage imageNamed:@"nocheck.png"];
        UIImage* checked = [UIImage imageNamed:@"check.png"];
        UIImage* disable = [UIImage imageNamed:@"disable_check.png"];
        [self setBackgroundImage:nocheck forState:UIControlStateNormal];
        [self setBackgroundImage:checked forState:UIControlStateSelected];
        [self setBackgroundImage:checked forState:UIControlStateHighlighted];
        [self setBackgroundImage:disable forState:UIControlStateDisabled];
        [self addTarget:self action:@selector(checkboxPush:) forControlEvents:UIControlEventTouchUpInside];
        [self setState:self];
    }
    
    - (id)initWithFrame:(CGRect)frame
    {
        NSLog(@"initWithFrame");
        self = [super initWithFrame:frame];
        if (self) {
            // Initialization code
            UIImage* nocheck = [UIImage imageNamed:@"nocheck.png"];
            UIImage* checked = [UIImage imageNamed:@"check.png"];
            UIImage* disable = [UIImage imageNamed:@"disable_check.png"];
            [self setBackgroundImage:nocheck forState:UIControlStateNormal];
            [self setBackgroundImage:checked forState:UIControlStateSelected];
            [self setBackgroundImage:checked forState:UIControlStateHighlighted];
            [self setBackgroundImage:disable forState:UIControlStateDisabled];
            [self addTarget:self action:@selector(checkboxPush:) forControlEvents:UIControlEventTouchUpInside];
            [self setState:self];
        }
        return self;
    }
    
    - (void)checkboxPush:(CheckboxButton*) button {
        button.checkBoxSelected = !button.checkBoxSelected;
        [button setState:button];
    }
    
    - (void)setState:(CheckboxButton*) button
    {
        if (button.checkBoxSelected) {
            [button setSelected:YES];
        } else {
            [button setSelected:NO];
        }
    }
    
    @end

これで、「CheckboxButton」クラスの作成は終了です。

次は、作成した「CheckboxButton」を使用する方法です。

2.「CheckboxButton」の使用方法

  1. Storyboardまたは、nibファイルに「Round Rect Button」を設置する。
  2. 設置したButtonのClass名に「CheckboxButton」を設定する

これだけでチェックボックスが実装できます。

実際に動かしたイメージが以下になります。

チェックボックスOFF時の状態

チェックボックスON時の状態

こんな感じでチェックボックスが実装できます。

「checkBoxSelected」の状態を取得することでチェックがON/OFFなのか判断できます。

CodeIgniterを参考に作った本当に簡易なフレームワーク


 

簡易PHPフレームワークの公開です。

CodeIgniterの設定をするのも大げさすぎるサイトを作ってたりするので

その時に使用している自作フレームワークを公開します。

大元は「CodeIgniter」でも本当に必要な機能を参考に作成しているものです。

とりあえず機能としては、

MVCの分離
DB接続(PDO)

くらいかも、

セキュリティも何も考慮にいれていないので

そのあたりは必要に応じて機能拡張で対応しています。

学習コストは、すこぶる低いです。

とりあえず「sample.php」を動作させた画面です。

こんな感じ、これを動作させる為のソースは

1.config.phpの修正

まず、config/config.phpを自分の環境に合わせて修正

<?php
// config設定
$config['db_name'] = 'dbname';
$config['db_host'] = 'localhost';
$config['db_user'] = 'dbuser';
$config['db_password'] = 'dbpassowrd';
$config['db_dns'] = "mysql:host={$config['db_host']}; dbname={$config['db_name']}";
$config['libDir'] = './libs/';
$config['viewDir'] = './views/';

core/gen.phpの9行目にあるconfig.php読み込み先の設定修正する

<?php
/**
 * 共通処理
 * 全てこのソースを一度requireしてから処理する
 */
ob_start();

// 読み込むconfigの設定を環境によって修正してください。
$config['configDir'] = './config/';

2.controllerの作成

とりあえず「core/gen.php」をrequireしてから全ては始まります。

<?php
require_once('core/gen.php');
// 表示データを格納
$data = array();

// 処理
$data['title'] = 'これはサンプルです';
$data['q1'] = $gen->http->getParam('q1', 'q1はありませんでした');

// ライブラリを読み込み
$gen->load('sample');
$data['sample'] = $gen->sample->get_sample();

// 表示するHTMLの呼び出し
$gen->view->load('sample', $data);

3.viewの作成

普通のphpです、$dataという変数に値が格納されて渡ってきます。

これは$gen->view->loadの呼び出し時の第2引数がそのまま渡されます。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
<div>title:<?php echo $data['title'] ?></div>
<div>q1($_GET['q1']):<?php echo $data['q1'] ?></div>
<pre>sample:<?php var_dump($data['sample']); ?></pre>
<div>now:<?php echo nowstr(); ?></div>

<div><a href="./sample.php?q1=aaa">q1テスト(aaa)</a></div>
<div><a href="./sample.php">q1テスト(値なし)</a></div>
</body>
</html>

機能拡張

1.libsの作成

contollerでの「$gen->load(‘sample’)」のようにすることで、

$config['libDir']に作成した同一名称のPHPをrequireして「ucfirst」の規約に則ったクラス名のクラスを自動生成します。

<?php

class Sample {
	var $gen;
	function __construct() {
		$this->gen =& get_instance();
	}

	function get_sample() {
		$sql = 'SELECT * FROM sample';
		$stmt = $this->gen->pdo->prepare($sql);
		$stmt->execute();
		$ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
		return $ret;
	}

}

2.helperの作成

$config['libDir']に作成した、helper.phpの中に記述されている関数はviewのどの場所からでも呼び出しが可能です。

views/sample.phpの9行目で使用例を記述しています。

<?php
function nowstr() {
	$str_time = date('Y-m-d H:i:s');
	return $str_time;
}
function isIphone() {
	$gen =& get_instance();
	return $gen->http->isIphone();
}

 

以上がフレームワークの機能です。

ソースコードはgithubで公開しています。

githubのリポジトリはこちらになります。

機能は本当にないので勝手に拡張して使って下さい。

ライセンスなどマズイ場合は連絡もらえたらと思います。

SSHのProxyCommandを使用すると踏み台サーバ経由のSSHが楽になる


 

仕事でよく、特定のIPアドレスからしかSSH接続を許可していないサーバがあると思います。

(俺的には、鍵認証のみでIP制限はずしてと思うのですがw)

 

この場合

「クライアントPC」→「踏み台SSHサーバ(許可されているIPアドレスのサーバ)」→「目的のサーバ」

という感じで1度無駄なsshコマンドが必要になるのでうざい、直接接続できたらどれだけハッピーか

とういことで「踏み台サーバがSSHのプロキシの役割すればいいのでは」ということで検索したら

ProxyCommand」というものを発見!!

で、設定方法

vim ~/.ssh/config
Host mokutekiserver.com
  ProxyCommand ssh proxyserver.com nc %h %p

このような感じで、記述すると

クライアントから直接 「ssh test@mokutekiserver.com」で接続できるようになります。

今まで:ssh proxy_user@proxyserver.com → ssh test@mokutekiserver.com

今回:ssh test@mokutekiserver.com

見事に、直接クライアントから目的のサーバへ直接つなげています。

間にはいる踏み台サーバには「nc」のインストールが必要ですが

「yum install nc」で簡単にインストールできます。

これで、煩わしい多段SSHが、退治できますので試してみて下さい。

参考にしたURL

iPhoneアプリで画面表示後に、別のViewControllerを呼び出す方法


 

iPhoneアプリで画面起動後に、別のViewContollerを表示させたい場合の備忘録

結論:viewDidAppearで処理を行う。

「viewWillAppear」、「viewDidLoad」で処理を行った場合、別のViewControllerが表示されませんでした。

「viewDidAppear」ここで処理を記述した場合にのみ、ちゃんと画面が表示されました。

return top