スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

swiftでSDWebImageを使って画像をキャッシュする方法をメモ

swiftでSDWebImageを使って画像をキャッシュする方法をメモ。
SDWebImageをswiftで使う方法は、こちらを参考に。

簡単に書いてメモっとくと、githubとかでSDWebImageのソースをダウンロードしてきて、プロジェクトにコピーして、swiftでobject-c使うためのBridding-header.h に
#import "UIImageView+WebCache.h"
を追加する。

SDWebImageDownloader.sharedDownloaderだと、キャッシュはされないでダウンロードだけされるらしい。
キャッシュを別のやつで実装するときなどは、こっちを使うと良いかも。

completed のところはバグがあるらしい。
https://github.com/rs/SDWebImage/issues/833

一応キャッシュも出来たので、下記の方法で大丈夫かと。

class ViewController: UIViewController {

@IBOutlet weak var sampleImage: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.

}

override func viewWillAppear(animated: Bool) {
println("viewWillAppear")
let url = NSURL(string: "http://test.com/image.png")

// SDWebImageDownloader.sharedDownloader().downloadImageWithURL(url,
// options: nil,
// progress: nil,
// completed: {[weak self] (image, data, error, finished) in
// if let wSelf = self {
// wSelf.sampleImage.image = image
// }
// })

SDWebImageManager.sharedManager().downloadImageWithURL(url,
options: SDWebImageOptions.CacheMemoryOnly,
progress: nil,
completed: { [weak self] (image, error, a, c, s) in
if let wSelf = self {
wSelf.sampleImage.image = image
}
})
}

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

@IBAction func unwindToTop(segue: UIStoryboardSegue) {
}
}


これでキャッシュされる。


参考サイト
Crash in swift, when I use self.xxxx in the completed block #833
【Swift】SDWebimageのcompletionバグ対応
SwiftでSDWebImageを使いたい
【iOS】SDWebImageでアプリ容量がどんどん増えていく件
スポンサーサイト

swiftでEXC_BREAKPOINT(code=1, ...)のエラーの対処法

swiftでEXC_BREAKPOINT(code=1, ...)のエラーの対処法のメモ。
viewWithTagで、タグを指定してviewを取得した時に重複してるタグとかがあると何かとよくない。
自分でつけるタグは、数を大きくしたりして重複避けるようにする。

0 とかにすると、初期値がそれらしいので、思わぬとこでエラーになる可能性がある。

参考サイト
viewWithTagメソッドの落とし穴

CAKEPHP2で特定のControllerとかactionだけBASIC認証をかける方法

CAKEPHP2で特定のControllerとかactionだけBASIC認証をかける方法のメモ。
Securityコンポーネント(CakePHP1系のみ)とか、Authコンポーネントでも出来るらしいけど、サクッと出来なかったのでこちらで対応。
これをAppControllerのbeforeFilterとか、かけたいactionとかで実行すればOK。

$loginId = 'hoge';
$loginPassword = 'fuga';

$this->autoRender = false;
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die("id / password Required");
} else {
if ($_SERVER['PHP_AUTH_USER'] != $loginId || $_SERVER['PHP_AUTH_PW'] != $loginPassword) {
header('WWW-Authenticate: Basic realm="Private Page"');
header('HTTP/1.0 401 Unauthorized');
die("Invalid id / password combination. Please try again");
}
}
$this->autoRender = true;


参考サイト
CakePHP:CakePHPでBasic認証を簡単に設定
[CakePHP][PHP]コンポーネントを利用せずにベーシック認証を実装する

swiftでUITabbarのタブを切り替える

swiftでUITabbarのタブを切り替える方法のメモ。
ool) {
self.tabBarController?.selectedViewController = self.tabBarController?.childViewControllers[1] as? UIViewController
}

swiftで画面表示時にtableviewを選択状態にする方法のメモ

swiftで画面表示時にtableviewを選択状態にする方法のメモ。
var _selectedKeys = [String: String]()
var tableView : UITableView!

// 選択時
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath)
{
self._selectedKeys[indexPath.row] = "1"
}
// 選択解除時
override func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath:NSIndexPath!) {
{
self._selectedKeys.removeValueForKey(indexPath.row)
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as CustomeViewCell

// 選択された状態かチェック
if let key = _selectedKeys[indexPath.row] {
self.selectedAction(cell, indexPath: indexPath, selected: true)
}else{
self.selectedAction(cell, indexPath: indexPath, selected: false)
}
return cell
}
func selectedAction(cell: CustomeViewCell, indexPath:NSIndexPath, selected: Bool) {
if(selected) {
self.tableView.selectRowAtIndexPath(indexPath, animated: false, scrollPosition: .None)
}else{
self.tableView.deselectRowAtIndexPath(indexPath, animated: false)
}
}


参考サイト
Swift - selectRowAtIndexPath not working with indexPathForSelectedRows
UITableViewのセルを画面表示時に選択状態にする

swiftでUIImageをbase64エンコードして画像アップロード

swiftでUIImageをbase64エンコードして画像アップロードする方法をメモ。

swift側
var image: UIImage = UIImage(named: "img")
var myFile:NSData = UIImagePNGRepresentation(image).base64EncodedDataWithOptions(.Encoding64CharacterLineLength)
var str = ""+NSString(data:myFile, encoding:NSUTF8StringEncoding)!
var iconBase64string = str.stringByReplacingOccurrencesOfString("+", withString:"%2B", options: nil, range: nil)
これで、iconBase64string をサーバー側に送信すればOK。
つまづいたのは、var str = ""+NSString(data:myFile, encoding:NSUTF8StringEncoding)! でNSData → String にするところ。NSStringのままだと、str.stringByReplacingOccurrencesOfString のrange のとこで
Type 'NSRange' does not conform to protocol 'NilLiteralConvertible'
のエラーが出たので、""+ で、Stringにしてる。
サーバー側では、こんな感じ。(PHPの場合)
function post_base64_decode($value)
{
return base64_decode(str_replace(' ', '+', $value));
}
$content = post_base64_decode($_POST['iconBase64string']);
これで$contentをファイルに書き出すなり、DBに保存するなりすればOK。

参考サイト
Swift: Base64 方式でエンコードする
[XCODE] iPhoneで画像をアプリケーション内に保存するには
UIImagePNGRepresentation
Objective-Cで画像をbase64エンコードして、NSStringに変換
Using a Swift String with NSData without NSString

tableviewでスクロールでデータを追加で読み込む方法のメモ

tableviewでスクロールでデータを追加で読み込む方法のメモ。

下に引っ張って更新する


UIRefreshControl を使うと便利。

参考サイト
JavaScriptプログラマがSwift iOSアプリを2週間で作って公開してみた〜その10 UIRefreshControl〜

一番下まで行ったら追加で読み込み


tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
で、indexPath.row が最後の時に読み込み処理を入れる。

参考サイト
JavaScriptプログラマがSwift iOSアプリを2週間で作って公開してみた〜その11 Infinite Scroll〜

ESETでiPhoneをUSBで接続した時にブロックされてしまった時の対処法

ESETでiPhoneをUSBで接続した時にブロックされてしまった時の対処法をメモ。

ESET入れて、iPhoneをmacに接続すると
iPhone
リムーバブルメディアはESET Cyber Security Proによって遮断されました
のポップアップが出た。
2015-03-10100736.png

設定の解除方法は、ESETの詳細設定の「アクセス制御」にある「メディア」で
”ブロックされたメディア”にある、iOSのチェックボックスをはずすと、アクセスが出来るようになる。
2015-03-10101018.png

設定は自己責任で。。

Sequel Proで検索結果のコピペの形式をPHPの配列にする方法

macのDBクライアントのGUIツールのSequel Proで、検索した結果をコピーして、それをどこかにコピペしたいって時があるかと思います。 で、そのコピペの形式をカスタマイズ出来るらしい。
その方法をメモ。
ちなみに、今回は検索した結果をPHPの配列形式でペーストする方法。

  1. Sequel Proのメニューの
    バンドル > バンドルエディタ でバンドルエディタを開く
  2. 左カラムにあるバンドル > データテーブル を選択して、下にある + ボタンをクリック
    ※CopyAsJSONがあれば、Duplicateする
  3. Sequel ProのサイトのバンドルのページでPHPの配列形式のバンドルを持ってくる。ページはこちら
    ここにある「Show selected rows as PHP array」のリンク先のgitのソースをコピペしてくる
  4. バンドルエディタのMenu Labelとか、ショートカットとかを適当に設定して、CommandのとこにPHP Arrayのソースをペーストして、Save
  5. これで使えるようになるので、検索結果を数行選択して、右クリック - バンドル - CopyAsPHPArrayとかって選択して、テキストエディタとかにペーストすればOK!
  6. CakePHPのFixtureとか作るときにとっても便利!

    参考サイト
    Sequel ProでのSQL崩し
    Sequel Pro Contributed Bundles

swiftでDictionaryのvalue値に色んな型を格納する方法

swiftでDictionaryのvalue値に色んな型を格納する方法のメモ。
やりたいことはPHPで言うとこんな感じのこと。
$ary = array(
"key1" => "value1",
"key2" => array("key2-1", "value2-1")
);

Playgroundでいろいろと試してたけど、2〜3日出来なかった。。
var dec1 = ["key1":"val1", "key2": "val2"] // OK
var ary1 = [dec1, dec1] // OK
// error: 'String' is not convertible to '[String : String]'
// のエラーが出る
// ↓
//var dec2 = ["key1":"val1", "key2": dec1]

これをするには
var dec2:[String: Any] = ["key1":"val1", "key2": dec1]
と、Any型を指定しないといけない。
AnyObjectじゃダメだった。
ドットインストールで、そういえばAnyって出てきてたなー。。

参考サイト
extract String values from Dictionary in Swift

自作のviewをxibで作る方法のメモ

自作のviewをxibで作る方法のメモ。

1.xibを作成する。(CustomView.xib)
2.xibにUILabelを配置する。
3.CustomView.swift を新規に作成
import UIKit
class CustomView : UIView {
class func instance() -> CustomView {
return UINib(nibName: "CustomView", bundle: nil).instantiateWithOwner(self, options: nil)[0] as CustomView
}
}
4.xibに戻って、PlaceHoldersのFile's Ownerと、ルートのViewの2箇所ののCustom Classを 作成したViewファイル名(ここでは"CustomView")に変更する。
5.UILabel にoutletを貼る。この時、xibのUILabelから、ドラッグしてCustomView.swiftの方に接続をする時に、出てくるダイアログで、objectの項目をFile's OwnerからCustom Viewの方に変更をする。
2015-03-09-236.png
6.ViewControllerで、ViewをaddSubViewする。
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
self.view.addSubview(CustomView.instance())
}


参考サイト
Xcode6で「.xibファイル」+「自作UIViewクラス」で、汎用できるViewを作りたい

Sublime Text のAlignmentの設定の仕方

Sublime Text のAlignmentの設定の仕方のメモ。
インストールは、パッケージインストーラーで「Alignment」を入れればOK。

Preferences > Settings - User に下記を追加
"alignment_chars": 
[
":", "=", "=>"
],
"alignment_space_chars":
[
"=", "=>"
]


デフォルトのショートカットがSublimeLinterとかぶっていたので、ショートカットを変更
Preferences > Key Bindings - User に下記を追加
{ "keys": ["ctrl+i"], "command": "alignment" },


これは便利すぎ!

参考サイト
sublime text3の環境を整えた
Sublime Textの作業効率を飛躍的に上げるプラグイン31個

iOS8, swiftでtableViewのいろいろ設定方法

iOS8, swiftでtableViewのいろいろ設定方法のメモ。

セルが選択された時の背景色を変更する

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("tableCell";, forIndexPath: indexPath) as UITableViewCell

cell.backgroundColor = UIColor.clearColor()
// 選択された時の背景色
var cellSelectedBgView = UIView()
cellSelectedBgView.backgroundColor = UIColor.redColor()
cell.selectedBackgroundView = cellSelectedBgView

return cell
}

UITableViewの複数選択と単一選択

Storyboardで設定する場合は、UITableViewのプロパティの「Selection」で「Multiple Selection」または「Single Selection」をそれぞれ指定する。

セルが選択された時、選択がはずれた時

選択された時
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath:NSIndexPath!) {
var cell = tableView.cellForRowAtIndexPath(indexPath) as CustomViewCell
cell.checkbox_image.image = UIImage(named:"checkbox_on")
cell.mylabel.textColor = UIColor.whiteColor()
}
選択解除された時
func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath:NSIndexPath!) {
var cell = tableView.cellForRowAtIndexPath(indexPath) as CustomViewCell
cell.checkbox_image.image = UIImage(named:"checkbox_of")
cell.mylabel.textColor = UIColor.blackColor()
}
※上記の例は、カスタムセルの中に配置したLabelとかimageを変更する時のやり方。


参考サイト
[iPhone] UITableView セルの選択 (Swift)
UITableViewのセルを選択した時にチェックマークをつける

swiftでNavigationControllerの戻るボタンを画像にする方法

swiftでNavigationControllerの戻るボタンを画像にする方法をメモ。
1.UINavigationControllerを継承したサブクラスを作成する
class MyNavigationController: UINavigationController, UINavigationControllerDelegate {

override func viewDidLoad() {
super.viewDidLoad()
self.delegate = self; // delegateセット
}

// MARK: UINavigationControllerDelegate
func navigationController(navigationController: UINavigationController, willShowViewController viewController: UIViewController, animated: Bool) {
let backButton: UIBarButtonItem = UIBarButtonItem()
backButton.title = "" // 前のページのタイトルが入っているので消す
viewController.navigationItem.backBarButtonItem = backButton;
}
}
2.storyboardのCustome ClassでUINavigationControllerの部分をMyNavigationControllerに変更。
3.AppDelegateのapplicationで背景セット
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
// Override point for customization after application launch.

UIBarButtonItem.appearance().setBackButtonBackgroundImage(UIImage(named: "back"), forState: .Normal, barMetrics: .Default)

return true
}
4.back.png をプロジェクトに入れる。back.pngは、72x72くらいだと、いい感じにおさまった。


参考サイト
UINavigationBarの戻るボタンのカスタマイズまとめ
[Swift]UINavigationControllerのBackButtonタイトル一括変更

Swift:ステータスバーを非表示にする

Swift:ステータスバーを非表示にする方法。
ViewController に以下のコードを記述すればステータスバーが非表示になる。
override func prefersStatusBarHidden() -> Bool {
return true
}

swiftでstoryboardを使用しないでアニメーション指定して画面遷移

swiftでstoryboardを使用しないでアニメーション指定して画面遷移する方法のメモ。
let vc = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("storyboard_id") as UIViewController
vc.modalTransitionStyle = .CrossDissolve
self.presentViewController(vc, animated: true, completion: nil)
modalTransitionStyleは、
  • CoverVertical・・・下から上がってくる
  • FlipHorizontal・・・横回転して切り替わる
  • CrossDissolve・・・フェードインで浮かび上がってくる
  • PartialCurl・・・ページをめくる感じ


参考サイト
アニメーションを指定して次の画面を呼び出す
UIViewController Class Reference

「Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set」の解決法

「Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set」の解決法。

2015-03-04185000.png
一番初めに表示させたいViewControllerの指定が無いため、storyboardで
Is Inicial View Controller
にチェックを入れればOK。

参考サイト
iPhone開発 perhaps the designated entry point is not set? エラー

CakePHP2でFixtureをディレクトリ分けする方法

CakePHP2では、Fixtureをテストケース毎に別にするのにファイルをいくつも作る必要があるらしい。
app/Test/Fixture の中がごちゃごちゃになってしまうので、フォルダ分けが出来るみたいなので、その方法をメモ。
1.app/Libに下記ファイルを新規作成。
AppFixtureManager.php

class AppFixtureManager extends CakeFixtureManager {

protected function _loadFixtures($fixtures) {
foreach ($fixtures as $fixture) {
$fixtureFile = null;
$fixtureIndex = $fixture;
if (isset($this->_loaded[$fixture])) {
continue;
}

if (strpos($fixture, 'core.') === 0) {
$fixture = substr($fixture, strlen('core.'));
$fixturePaths[] = CAKE . 'Test' . DS . 'Fixture';
} elseif (strpos($fixture, 'app.') === 0) {
// MODIFIED
// app.unittest.plan が来たら /fixtures/unittest/plan_fixtures.php
// をロードするようにする
$parts = explode('.', $fixture);
$fixture = $parts[count($parts) - 1];

array_shift($parts);
array_pop($parts);
$path = implode(DS, $parts);

$fixturePaths = array(
TESTS . 'Fixture' . DS . $path,
TESTS . 'Fixture'
);
} elseif (strpos($fixture, 'plugin.') === 0) {
$parts = explode('.', $fixture, 3);
$pluginName = $parts[1];
$fixture = $parts[2];
$fixturePaths = array(
CakePlugin::path(Inflector::camelize($pluginName)) . 'Test' . DS . 'Fixture',
TESTS . 'Fixture'
);
} else {
$fixturePaths = array(
TESTS . 'Fixture',
CAKE . 'Test' . DS . 'Fixture'
);
}

$loaded = false;
foreach ($fixturePaths as $path) {
$className = Inflector::camelize($fixture);
if (is_readable($path . DS . $className . 'Fixture.php')) {
$fixtureFile = $path . DS . $className . 'Fixture.php';
require_once $fixtureFile;
$fixtureClass = $className . 'Fixture';
$this->_loaded[$fixtureIndex] = new $fixtureClass();
$this->_fixtureMap[$fixtureClass] = $this->_loaded[$fixtureIndex];
$loaded = true;
break;
}
}

if (!$loaded) {
$firstPath = str_replace(array(APP, CAKE_CORE_INCLUDE_PATH, ROOT), '', $fixturePaths[0] . DS . $className . 'Fixture.php');
throw new UnexpectedValueException(__d('cake_dev', 'Referenced fixture class %s (%s) not found', $className, $firstPath));
}
}
}
}

2.app/Test/Fixture の配下にディレクトリ作成。(仮にMytestとする)
3.いつものFixtureのファイルを作成(仮にTest001Fixture.php)
4.例えばモデルのテストで使う方法。
class MytestTest extends CakeTestCase {

/**
* Fixtures
*
* @var array
*/
public $fixtures = array(
'app.Mytest.Test002'
);
public $autoFixtures = false;

public function testLoadDirectoryFixture() {
$this->loadFixtures('Test002');
}
}
これで、testLoadDirectoryFixture内のテストで読み込めるようになる。

参考サイト
テスト - CakePHP Cookbook 2.x ドキュメント
【CakePHP2】Fixtureをディレクトリ分け

navigationBar で背景と文字色を変更する方法

swiftでnavigationBar で背景と文字色を変更する方法のメモ。

背景色変更

self.navigationController?.navigationBar.barStyle = .Black
self.navigationController?.navigationBar.backgroundColor = UIColor.blackColor()
navigationBar.barStyleでスタイルを変更したあとに、navigationBar.backgroundColorで変更しないと、背景が透過されているのか、灰色っぽい色になってた。

文字色の変更

let v = UILabel(frame:CGRectMake(0, 0, self.view.frame.width, self.view.frame.height));
v.textColor = UIColor.lightGreenColor()
v.text = self.navigationItem.title
v.textAlignment = .Center
self.navigationItem.titleView = v


参考サイト
[iOS] UINavigationBarのタイトル色・背景色変更まとめ
UIKit Data Types Reference
UINavigationItem Class Reference

UIColorの使い方と16進数カラーコードからの変換

UIColorの使い方と16進数カラーコードからの変換の仕方。
UIColorの宣言の仕方は
let color:UIColor = UIColor(red:0.0,green:0.5,blue:1.0,alpha:1.0)
で出来る。
RGBを0.0〜1.0の間で指定する必要がある。

これをswiftのextensionにする方法
extentions.swift というファイルを新規でプロジェクト内に作成して、下記の内容で保存する。
extension UIColor {
class func hex (var hexStr : NSString, var alpha : CGFloat) -> UIColor {
hexStr = hexStr.stringByReplacingOccurrencesOfString("#", withString: "")
let scanner = NSScanner(string: hexStr)
var color: UInt32 = 0
if scanner.scanHexInt(&color) {
let r = CGFloat((color & 0xFF0000) >> 16) / 255.0
let g = CGFloat((color & 0x00FF00) >> 8) / 255.0
let b = CGFloat(color & 0x0000FF) / 255.0
return UIColor(red:r,green:g,blue:b,alpha:alpha)
} else {
print("invalid hex string")
return UIColor.whiteColor();
}
}
}

これで下記の方法で使える。
UIColor.hex("45fb4b", alpha: 0.8)


参考サイト
UIColorを16進から取得

swiftのUITextFieldでpaddingを指定する方法

swiftのUITextFieldでpaddingを指定する方法をメモ。

UITextFieldを継承したクラスを作ってやってみました。
class MyTextField : UITextField {

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
self.setting()
}

override init(frame: CGRect) {
super.init(frame: CGRectMake(0, 0, 0, 0))
self.setting()
}

override init() {
super.init()
self.setting()
}

func setting() {
self.setPadding()
}

private func setPadding() {
let v = UIView(frame:CGRectMake(0, 0, 10, self.frame.height));
v.backgroundColor = .clearColor()
self.leftView = v
self.leftViewMode = .Always
}
}
この作成したクラスをstoryboradのcustome classで指定すればOK。

参考サイト
[iOS] UITextFieldでパディングを設定する方法
【Objective-CとSwift比較】※今後追加予定
UITextField Class Reference

プロフィール

U2K

Author:U2K
いろいろプログラムに関しての覚え書きをちょくちょくと書いていきます。

オススメ










オススメ

忍者AdMax

u2k on Twitter

最近の記事


上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。