月別アーカイブ: 2019年3月

【Swift4】UITableViewで常時並べ替え可能にする。

参考サイト
UITableViewで常にCellの並び替え(ソート)ができるようにする – Qiita
UITableViewのデリゲートメソッドまとめ – Qiita

viewDidLoadに下記を追加して常時編集状態にする。
tableView.isEditing = true
tableView.allowsSelectionDuringEditing = true

並べ替え可能にするメソッド。
func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
return true
}

並べ替え結果を処理するメソッド。
func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
// TODO: 入れ替え時の処理を実装する(データ制御など)
}

編集状態の見た目を編集する。
//左側の+やーを表示
func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
return .none //表示させない。
}
//編集モード時に左にずれるか。
func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
return false //ずれない。
}

これらを前回の記事
【Swift4】UITableViewの基本のき。 | iPhoneアプリ備忘録
に適用すると。

import UIKit

class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    //あうとれっとせつぞく
    @IBOutlet weak var tableView: UITableView!
    //てきとうなはいれつ
    var items:[String?] = ["Apple","Banana","Orange"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //デリゲートとデータソースの設定。
        tableView.delegate = self
        tableView.dataSource = self
        //常時並べ替え可にする
        tableView.isEditing = true
        tableView.allowsSelectionDuringEditing = true
    }
    
    //セクションの設定。(必須)とりあえず1
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }
    
    //セルの個数。(必須)配列のカウントだけ。
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }
    
    //セル本体の設定(必須)
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //セルのオブジェクトを作ります
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
        //タグ番号でオブジェクトにアクセスします。
        let label1 = cell.viewWithTag(1) as! UILabel
        label1.text = self.items[indexPath.row]
        
        return cell
    }
    
    //並び替え可能に
    func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        return true
    }
    
    //並べ替えた結果を配列に適用
    func tableView(_ tableView: UITableView, moveRowAt sourceIndexPath: IndexPath, to destinationIndexPath: IndexPath) {
        // TODO: 入れ替え時の処理を実装する(データ制御など)
        
        if let targetTitle:String = items[sourceIndexPath.row] {
            //元の位置のデータを配列から削除
            items.remove(at:sourceIndexPath.row)
            //移動先の位置にデータを配列に挿入
            items.insert(targetTitle, at: destinationIndexPath.row)
        }
        print(items)
        //テーブルビューをリロードする。
        tableView.reloadData()
    }
    
    //見た目の編集
    //左側の+やーを表示
    func tableView(_ tableView: UITableView, editingStyleForRowAt indexPath: IndexPath) -> UITableViewCell.EditingStyle {
        return .none //表示させない。
    }
    //編集モード時に左にずれるか。
    func tableView(_ tableView: UITableView, shouldIndentWhileEditingRowAt indexPath: IndexPath) -> Bool {
        return false //ずれない。
    }
}

起動すると
Simulator Screen Shot - iPhone X - 2019-03-14 at 10.47.40
この様な感じでいつでも並べ替え可能になる。

【Swift4】UITableViewの基本のき。

UITableViewをよく使います。そんなとき、Master-DetailやNavigationControllerを使うとある程度最初から組んであるのですが、もうちょっと柔軟性が欲しい時や自分の後学のため、備忘録です。

参考サイトはこちら。
5分でUITableViewを作ってみる。 – Qiita

まず、Storyboardでテーブルビューの準備から。
利便性のためナビゲーションコントローラーを使います。(笑)
スクリーンショット 2019-03-12 16.05.13

でも、ルートビューコントローラーがよくわからないので右側のビューを削除します。(笑)
スクリーンショット 2019-03-12 16.05.13

で、普通のビューコントローラーを置いてroot view controllerでつなぎます。(笑)
Projectを作った最初のViewを使っても良いです。それなら.swiftふぁいるもついてるしね。
スクリーンショット 2019-03-12 16.06.02
スクリーンショット 2019-03-12 16.06.30
スクリーンショット 2019-03-12 16.14.19

そうするとナビゲーションバー付きのビューになります。(笑)
スクリーンショット 2019-03-12 16.08.49

ここにさらに使い勝手を良くするためにVertical stack Viewを追加し、上下左右のマージンを0にします。
スクリーンショット 2019-03-12 16.22.55

更にその中にUITableViewを放り込むと上下左右ピタッとくっつき、ついでにTableViewCellをいれるととりあえずテーブルビューの完成。
スクリーンショット 2019-03-12 16.25.31

こうしておくとナビゲーション付きの子ビューも作りやすいし、テーブルビューの上下に検索窓やボタン、広告類なども設置しやすくなります。
.isHiddenを使えば隙間をテーブルビューが埋めてくれます。

ついで、セルはidentifierにCellと設定。
スクリーンショット 2019-03-12 16.57.39

セルの中に一つUILabelを入れて四方を0のConstraintで設定。その際、Tagを1に設定。
スクリーンショット 2019-03-12 17.00.55

Storyboardの準備はこんな感じかな。

さて、やっとコードのキホンのキです。
まずはStoryboardのUITableviewをoutlet接続しておきます。
ついでに簡単な配列も作っておきます。

import UIKit

class TableViewController: UIViewController {
    //あうとれっとせつぞく
    @IBOutlet weak var tableView: UITableView!
    //てきとうなはいれつ
    let items = ["Apple","Banana","Orange"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
}

テーブルビューに必須のメソッドを書いていきます。
まずはセクションを返すもの。とりあえず1かな。

    //セクションの設定。(必須)とりあえず1
    func numberOfSections(in tableView: UITableView) -> Int {
        return 1
    }

セルの数。テーブルビューに入れる配列の数だけ。

    //セルの個数。(必須)配列のカウントだけ。
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.items.count
    }

セル本体の設定をします。

    //セル本体の設定(必須)
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        //セルのオブジェクトを作ります
        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath as IndexPath)
        //タグ番号でオブジェクトにアクセスします。
        let label1 = cell.viewWithTag(1) as! UILabel
        label1.text = self.items[indexPath.row]
        
        return cell
    }

最後にdelegateとdataSourceの設定をします。
クラスの宣言のところで、
, UITableViewDelegate, UITableViewDataSource
と、viewDidLoadで、
tableView.delegate = self
tableView.dataSource = self
を追加します。

import UIKit

class TableViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    //あうとれっとせつぞく
    @IBOutlet weak var tableView: UITableView!
    //てきとうなはいれつ
    let items = ["Apple","Banana","Orange"]
    
    override func viewDidLoad() {
        super.viewDidLoad()
        //デリゲートとデータソースの設定。
        tableView.delegate = self
        tableView.dataSource = self
    }

これでテーブルビューが表示されます。
スクリーンショット 2019-03-12 17.22.05

【cocoapods】たまにしか使わないのですぐにわからなくなる。/(^o^)\

Firebase admobをやってみようと思った。
cocoapodsで入れるんだけど使い方忘れた。

って前にも書いたような気がする。/(^o^)\
超初心者向け【cocoapods】の始め方。 | iPhoneアプリ備忘録
【CocoaPods】Podfileの書き方が変わっていた。 | iPhoneアプリ備忘録

2年くらい前か。(^_^;)
バージョンも変わってるかなと試してみた。

とりあえずルビーのアップデートはこれでええんかいな?

$ sudo gem update --system

結果↓

$ sudo gem update --system
Password:
Updating rubygems-update
Fetching: rubygems-update-3.0.2.gem (100%)
Successfully installed rubygems-update-3.0.2
Parsing documentation for rubygems-update-3.0.2
Installing ri documentation for rubygems-update-3.0.2
Installing darkfish documentation for rubygems-update-3.0.2
Done installing documentation for rubygems-update after 77 seconds
Parsing documentation for rubygems-update-3.0.2
Done installing documentation for rubygems-update after 0 seconds
Installing RubyGems 3.0.2
ERROR:  While executing gem ... (Errno::EPERM)
    Operation not permitted @ rb_sysopen - /System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/gem

うむ。なんかエラーが出た。
後で調べたらここが参考になった。
gem updateでエラーが出た時の対処法 | ハックノート

$ sudo gem update --system -n /usr/local/bin
$ sudo gem install -n /usr/local/bin cocoapods

よくわからんが

$  sudo gem install -n /usr/local/bin cocoapods

とやってみた。

結果↓

$  sudo gem install -n /usr/local/bin cocoapods
Password:
Fetching thread_safe-0.3.6.gem
Fetching activesupport-4.2.11.gem
Fetching concurrent-ruby-1.1.4.gem
Fetching i18n-0.9.5.gem
Fetching cocoapods-core-1.6.1.gem
Fetching cocoapods-deintegrate-1.0.3.gem
Fetching claide-1.0.2.gem
Fetching nap-1.1.0.gem
Fetching fuzzy_match-2.0.4.gem
Fetching cocoapods-downloader-1.2.2.gem
Fetching cocoapods-plugins-1.0.0.gem
Fetching tzinfo-1.2.5.gem
Fetching cocoapods-trunk-1.3.1.gem
Fetching cocoapods-stats-1.1.0.gem
Fetching cocoapods-search-1.0.0.gem
Fetching CFPropertyList-3.0.0.gem
Fetching netrc-0.11.0.gem
Fetching cocoapods-try-1.1.0.gem
Fetching nanaimo-0.2.6.gem
Fetching atomos-0.1.3.gem
Fetching gh_inspector-1.1.3.gem
Fetching xcodeproj-1.8.1.gem
Fetching escape-0.0.4.gem
Fetching fourflusher-2.2.0.gem
Fetching colored2-3.1.2.gem
Fetching molinillo-0.6.6.gem
Fetching ruby-macho-1.4.0.gem
Fetching cocoapods-1.6.1.gem
Successfully installed concurrent-ruby-1.1.4
Successfully installed i18n-0.9.5
Successfully installed thread_safe-0.3.6
Successfully installed tzinfo-1.2.5
Successfully installed activesupport-4.2.11
Successfully installed nap-1.1.0
Successfully installed fuzzy_match-2.0.4
Successfully installed cocoapods-core-1.6.1
Successfully installed claide-1.0.2
Successfully installed cocoapods-deintegrate-1.0.3
Successfully installed cocoapods-downloader-1.2.2
Successfully installed cocoapods-plugins-1.0.0
Successfully installed cocoapods-search-1.0.0
Successfully installed cocoapods-stats-1.1.0
Successfully installed netrc-0.11.0
Successfully installed cocoapods-trunk-1.3.1
Successfully installed cocoapods-try-1.1.0
Successfully installed molinillo-0.6.6
Successfully installed atomos-0.1.3
Successfully installed CFPropertyList-3.0.0
Successfully installed colored2-3.1.2
Successfully installed nanaimo-0.2.6
Successfully installed xcodeproj-1.8.1
Successfully installed escape-0.0.4
Successfully installed fourflusher-2.2.0
Successfully installed gh_inspector-1.1.3
Successfully installed ruby-macho-1.4.0
Successfully installed cocoapods-1.6.1
Parsing documentation for concurrent-ruby-1.1.4
Installing ri documentation for concurrent-ruby-1.1.4
Parsing documentation for i18n-0.9.5
Installing ri documentation for i18n-0.9.5
Parsing documentation for thread_safe-0.3.6
Installing ri documentation for thread_safe-0.3.6
Parsing documentation for tzinfo-1.2.5
Installing ri documentation for tzinfo-1.2.5
Parsing documentation for activesupport-4.2.11
Installing ri documentation for activesupport-4.2.11
Parsing documentation for nap-1.1.0
Installing ri documentation for nap-1.1.0
Parsing documentation for fuzzy_match-2.0.4
Installing ri documentation for fuzzy_match-2.0.4
Parsing documentation for cocoapods-core-1.6.1
Installing ri documentation for cocoapods-core-1.6.1
Parsing documentation for claide-1.0.2
Installing ri documentation for claide-1.0.2
Parsing documentation for cocoapods-deintegrate-1.0.3
Installing ri documentation for cocoapods-deintegrate-1.0.3
Parsing documentation for cocoapods-downloader-1.2.2
Installing ri documentation for cocoapods-downloader-1.2.2
Parsing documentation for cocoapods-plugins-1.0.0
Installing ri documentation for cocoapods-plugins-1.0.0
Parsing documentation for cocoapods-search-1.0.0
Installing ri documentation for cocoapods-search-1.0.0
Parsing documentation for cocoapods-stats-1.1.0
Installing ri documentation for cocoapods-stats-1.1.0
Parsing documentation for netrc-0.11.0
Installing ri documentation for netrc-0.11.0
Parsing documentation for cocoapods-trunk-1.3.1
Installing ri documentation for cocoapods-trunk-1.3.1
Parsing documentation for cocoapods-try-1.1.0
Installing ri documentation for cocoapods-try-1.1.0
Parsing documentation for molinillo-0.6.6
Installing ri documentation for molinillo-0.6.6
Parsing documentation for atomos-0.1.3
Installing ri documentation for atomos-0.1.3
Parsing documentation for CFPropertyList-3.0.0
Installing ri documentation for CFPropertyList-3.0.0
Parsing documentation for colored2-3.1.2
Installing ri documentation for colored2-3.1.2
Parsing documentation for nanaimo-0.2.6
Installing ri documentation for nanaimo-0.2.6
Parsing documentation for xcodeproj-1.8.1
Installing ri documentation for xcodeproj-1.8.1
Parsing documentation for escape-0.0.4
Installing ri documentation for escape-0.0.4
Parsing documentation for fourflusher-2.2.0
Installing ri documentation for fourflusher-2.2.0
Parsing documentation for gh_inspector-1.1.3
Installing ri documentation for gh_inspector-1.1.3
Parsing documentation for ruby-macho-1.4.0
Installing ri documentation for ruby-macho-1.4.0
Parsing documentation for cocoapods-1.6.1
Installing ri documentation for cocoapods-1.6.1
Done installing documentation for concurrent-ruby, i18n, thread_safe, tzinfo, activesupport, nap, fuzzy_match, cocoapods-core, claide, cocoapods-deintegrate, cocoapods-downloader, cocoapods-plugins, cocoapods-search, cocoapods-stats, netrc, cocoapods-trunk, cocoapods-try, molinillo, atomos, CFPropertyList, colored2, nanaimo, xcodeproj, escape, fourflusher, gh_inspector, ruby-macho, cocoapods after 38 seconds
28 gems installed

なんかインストールできたっぽい。
良かったよかった?/(^o^)\

インストールできたらセットアップも必要らしい。

$ pod setup

結果↓

$ pod setup
Setting up CocoaPods master repo
  $ /usr/bin/git -C /Users/ユーザー名/.cocoapods/repos/master fetch origin
  --progress
  remote: Enumerating objects: 104182, done.        
  remote: Counting objects: 100% (104182/104182), done.        
  remote: Compressing objects: 100% (175/175), done.        
  remote: Total 1890451 (delta 104040), reused 104078 (delta 103999), pack-reused 1786269        
  Receiving objects: 100% (1890451/1890451), 253.22 MiB | 3.26 MiB/s, done.
  Resolving deltas: 100% (1278869/1278869), completed with 10144 local objects.
  From https://github.com/CocoaPods/Specs
     a964d6c397f..417810a7461 master                -> origin/master
   * [new branch]            backz                 -> origin/backz
   * [new branch]            cdn_scripts           -> origin/cdn_scripts
   * [new branch]            swift_version_support -> origin/swift_version_support
  $ /usr/bin/git -C /Users/ユーザー名/.cocoapods/repos/master rev-parse
  --abbrev-ref HEAD
  master
  $ /usr/bin/git -C /Users/ユーザー名/.cocoapods/repos/master reset --hard
  origin/master
  Checking out files: 100% (186163/186163), done.
  HEAD is now at 417810a7461 [Add] Geth 1.9.0-unstable.17859
warning: inexact rename detection was skipped due to too many files.
warning: you may want to set your diff.renameLimit variable to at least 183753 and retry the command.

CocoaPods 1.7.0.beta.1 is available.
To update use: `sudo gem install cocoapods --pre`
[!] This is a test version we'd love you to try.

For more information, see https://blog.cocoapods.org and the CHANGELOG for this version at https://github.com/CocoaPods/CocoaPods/releases/tag/1.7.0.beta.1

Setup completed

せったっぷかんりょうです。\(^o^)/

続いて、
podファイルを用意する。
まずXcodeのProjectのあるフォルダを表示。
スクリーンショット 2019-03-02 16.56.22
更にそのProjectの入っている一つ上のディレクトリに移動。

ターミナルをそのディレクトリに移動する。
ターミナルで、$ cd と書いたあとにProjectのフォルダをドラッグアンドドロップする。

で、

$ pod init

すると
そのフォルダ内にPodfileが作成される。

今回作成されたPodFileの中身はこんな感じ。

# Uncomment the next line to define a global platform for your project
# platform :ios, '9.0'

target 'admobFireBaseTest' do
  # Comment the next line if you're not using Swift and don't want to use dynamic frameworks
  use_frameworks!

  # Pods for admobFireBaseTest

  target 'admobFireBaseTestTests' do
    inherit! :search_paths
    # Pods for testing
  end

  target 'admobFireBaseTestUITests' do
    inherit! :search_paths
    # Pods for testing
  end

end