Author Archives

raizan2ame

Swift4:UITableViewの高さ

UITableViewの高さ、行数、行の高さ・ヘッダーの高さ、先頭行位置、最終行位置などの操作についてのメモです。

この作表においては、.reloaData()を適当に入れたためこれが悪さし、各行の更新が終わらないようになり(ループしてしまい)、とても苦労しました。Z.bookArrayは[String]でbookmarkの配列になります。wkGyosuPerPageはInt、wkRowsizeとwkHeadersizeは常数(Int)です。

🔴 先頭行へのスクロールは単純です(Scroll to the top)。

    @IBAction func IBAExecGo2Top() {                                //スクロール先頭
        self.vTableView.scrollToRow(at: IndexPath(row: 0, section: 0), at: .top, animated: false)//
        wkIndexPath                 = IndexPath(row: 0, section: 0) //
    }//=============================================================//

🔴 最終行へのスクロールは1ページの行数と最終行位置で計算をする必要があります。
(Scroll to the bottom. Calculate the rows in the last page.)

wkGyosuPerPage = Int((vTableView.frame.height – wkHeadersize) / wkRowsize)

    @IBAction func IBAExecGo2Bottom() {                             //スクロール最後
        var wRow:Int                = Z.bookArray.count – 1         //最後の行位置
        if wRow < wkGyosuPerPage    { wRow   = 0 }                  //1ページ内に収まるとき、先頭行から表示。
        else                        { wRow   = wRow – (wkGyosuPerPage – 1) }//最終行ー(1ページ行数1)から表示。
        self.vTableView.scrollToRow(at: IndexPath(row: wRow, section: 0), at: .top, animated: false)//
        wkIndexPath                 = IndexPath(row:wRow, section:0)//
    }//=============================================================//

🔴 表全体の行数(The number of rows in all.)

    func tableView(_ tableView:UITableView, numberOfRowsInSection section:Int) -> Int {//表の行数を返す
        return Z.bookArray.count                                    //☎️♻️return♻️ bookmarkの行数
    }//=============================================================//☎️

🔴 表示(Edit the row.)

    func tableView(_ tableView:UITableView, cellForRowAt indexPath:IndexPath) -> UITableViewCell {//表示
        var wCell:UITableViewCell                                   //☎️
        wCell = ExecSetValue(tableView, pIndex:indexPath)           //☎️表に値をsetする。wCellは編集結果。
        return wCell                                                //☎️♻️return♻️ infoArray cellを返す。
    }//=============================================================//☎️

🔴 クリック時の処理(The process for the selected row.)

    func tableView(_ tableView:UITableView, didSelectRowAt indexPath:IndexPath) {//クリックした行位置
        ExecClickedRow(indexPath.row, pCount:indexPath.count)       //☎️
        vTableView.selectRow(at: indexPath, animated: false, scrollPosition: .none)
    }//=============================================================//☎️

🔴 行の高さ(The height definition execpt the header.)

    func tableView(_ tableView:UITableView, heightForRowAt indexPath:IndexPath) -> CGFloat {//行の高さ
        return wkRowsize                                            //☎️
    }//=============================================================//☎️

🔴 ヘッダーの高さ(The height definition for the header.)

   func tableView(_ tableView:UITableView, heightForHeaderInSection section:Int) -> CGFloat {//ヘッダ高さ
       return wkHeadersize                                         //☎️
   }//=============================================================//☎️

🔴 ヘッダーの表示(Edit the header.)

    func tableView(_ tableView:UITableView, viewForHeaderInSection section:Int) -> UIView? {//ヘッダー設定
        let wHeader = ExecSetHeader(tableView, pSection:section)    //☎️ヘッダーを設定する。
        return wHeader                                              //☎️
    }//=============================================================//☎️

Screenshot 2018-05-13 07.41.26

Swift4:UIPickerView

必要に迫られ、ダイヤル方式のUI(UIPickerView)を実装しました。

使い方はtableViewと似ています。任意の初期値より、UIを設定するのに迷いました。

  • 一番迷ったところは、selectRowでした。何を勘違いしたのか、selectedRowになっていたため全く想定通りに動きませんでした。
  • もう一点は、UIPickerViewをstoryboardとプログラム変数と接続しないと、selectRowで値を任意の行(row)に設定できません。
  • アイコン(image)とテキストを合成して表示できます。アイコンはnilでも通ります。最初左揃えのテキストだけにしていたのですが、UIButtonに統一しました。色はstoryboardでも指定できます。
  • カラム(列)に分けることも可能です。

追記:書き換えた後、reloadしないと表示が更新されませんでした。
例) yPVLanguage.reloadAllComponents()

Screenshot 2018-05-08 14.28.49

Screenshot 2018-05-08 14.28.29

 

Swift4:iOSでのファイルハンドリング

iOSアプリでファイルの読み書きをしたいとき、アプリフォルダに入れるのが簡単です。

iCloudコンテナを使ってみたのですが、要領が悪いせいか、最新ファイルを確実に得ることができず苦労しました。その点、この方法は確実です。

info.plistにつぎのキーを追加し、YESにします。

Application supports iTunes file sharing
Supports opening documents in place

ファイルは次の場所にあります。ファイルアクセスは通常の方法で可能です。

Screenshot 2018-04-26 07.11.49

参考:iOS 11ファイルAppにDocumentsフォルダを表示して他のアプリと共有する方法

Swift4:ソートのNSStringを変更

NSStringが少し危ない件、最後に残っていたソートのNSStringも変更しました。

変更点は次のサンプルの赤い文字の部分です。

ついでにソートキーの変更はメッセージと同じ方式のモーダルで対処することで設定を簡便にしました。

😂 Before

let wCond:NSSortDescriptor = NSSortDescriptor(key:pIdentifier,
ascending:pSeq, selector: #selector(NSString.caseInsensitiveCompare(_:)))
let wResult = (Z.rcArray as NSArray).sortedArray(using: [wCond])//<– Swift 3.0

😊 After

func ExecSort(_ pIdentifier:String, pSeq:Bool) {
var wFile:String       = “” //Save the current row’s uniq key to find the row after sorting.
  if Z.maybeLastRow >= 0 { wFile = Z.rcArray[Z.maybeLastRow][Z.fFile] as! String }
else { }
  let wCond   = NSSortDescriptor(key:pIdentifier,ascending:pSeq)   
  let wResult = (Z.rcArray as NSArray).sortedArray(using: [wCond]) as NSArray 
Z.rcArray               = []
Z.rcArray               = wResult
  Z.maybeLastRow          = ExecGetCurrentRow(wFile)
yTableView?.reloadData()
}

😊 Reverse

func ExecSortReverse() {
var wFile:String         = “”
if Z.maybeLastRow >= 0 { wFile = Z.rcArray[Z.maybeLastRow][Z.fFile] as! String }
else { }
  Z.rcArray = Z.rcArray.reversed()
  Z.maybeLastRow           = ExecGetCurrentRow(wFile)
yTableView?.reloadData()
}

 

Swift4:NSStringの問題

時々、NSStringを使っている箇所でトラブルが起きるので、この際、代わりの方法を見つけ、改めることにしました。

その中でNSRangeだけが残ったので、次のように対応しました。

func CallGetStringByNSRange(_ pString:String, pRange:NSRange) -> String {
if pRange.location >= pString.count
|| pRange.location < 0
|| pRange.length <= 0 || pRange.location+pRange.length > pString.count { return “” }
    return String(pString[Range(pRange, in: pString)!])        
}

 

Swift4:.htmlファイルとbookmark

bookmarkとして読み込んだ.htmlファイルを書き込もうとしたのですが、うまくいきません。テキストで書き込まれてしまいます。

ない知恵を絞った結果、やりたいことは、

  • デフォルトのbookmarkを利用できるようにしたい
  • ユーザーが固有のbookmarkを使えるようにしたい
という2点に尽きるので、デフォルトのbookmarkはプログラム内に.htmlを定義して読み込むことにし、ユーザー固有のbookmarkは、従来通り、外部ファイルから読み込むことにしました。

.htmlファイルを読み込むとき、今までencodeを指定していなかったのですが、指定できるように変更しました。

プログラムに内包した.htmlファイルの読み込みは意外と簡単でした。

bookmarkの開閉処理でフォルダでbookmarkが泣き別れるとき、これをちゃんと開閉できないバグがあったので修正しました。

Calling sequence to read a user’s .html file.
var wA:String? = Com.CallReadHTMLfile(pFilepath,
pEncode: String.Encoding.utf8.rawValue)

 

func CallReadHTMLfile(_ pFilepath:String, pEncode:UInt) -> String? {//<*Read .html file*
var wString:String?           = nil                             //
    if CallFileExists(pFilepath) == “NG” {                      //This file exists?
       return nil                                               //♻️return♻️ Not exist.
    } else { }                                                  //
    do {                                                        //
        wString   = try String(contentsOf: URL(fileURLWithPath:pFilepath),
                    encoding:String.Encoding(rawValue: pEncode))//Read .html file
    } catch {                                                   //
    }                                                           //
    if wString == nil { return nil }                            //♻️return♻️ error
    else            { return String(describing: wString) }      //♻️return♻️ normal end
}//🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳

◾️How to read a .html file bundled in Swift program

func ExecGetBookmarks() -> String {                      //<*Read a default bookmark file*>
  let wFilepath:String? = Bundle.main.path(forResource: “MesaBookmarks, ofType: “html”)//
  if wFilepath == nil { return “” }                      //♻️return♻️ NA
  else { }                                               //
  let wBookmark:String = try! String(contentsOfFile: wFilepath!, encoding: String.Encoding.utf8)//
  return wBookmark                                       //
}//🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳🐳

Screenshot 2018-04-16 08.03.17

Swift4:Safariコンテンツブロック・メモ

httpからhttpsへのコンバートで副作用が起きました。

何が正しい結果なのかわかりませんが、少しイメージと違う結果になりました。

それにしても、手持ちのフィルタをSafariコンテンツブロックフィルタに移植したのですが、勘違いと錯誤による手間がとてもかかってしまいました。基本の欠如が原因です。

cookieがブロックされているかどうか、どうすればわかるのでしょう?とても気になります。

URLは産経新聞ニュース十段戦第3局 井山裕太十段が勝って3連覇、七冠を堅持「運がよかった」です。

Screenshot 2018-04-12 22.55.55

Screenshot 2018-04-13 04.58.51

Swift4:コンテンツブロックに関わるメモ

忘備録です。

  1. json改を使ったアプリ版で.jsonファイルを取り込めなくなっていたのは、Copy Bundle Resourcesに.jsonファイルを組み込んでいなかったことが原因でした。今回の件がなければ、使うのを諦め、気がつかないところでした。
    Screenshot 2018-04-10 00.19.26
  2. json改を使ったアプリ版では、.jsonファイルを使わず、フィルタをメモリ(プログラム)だけに定義することにしました。ファイルからだと時間がかかる(?)。フィルタはタブやスペースを使って、整理することができました。
    Screenshot 2018-04-10 00.34.38
  3. コンテンツブロックのOn/OffはpWebView.configuration.userContentController.removeAllContentRuleLists()で可能でした。ユーザーがOn/Offできれば、Safari版コンテンツブロックか、私版コンテンツブロックかは問われないため。
  4. 課題(1) Safari版コンテンツブロック(=json改アプリ版)では、どのフィルタがヒットしているかわからないので、コンテンツブロックの統計情報を取る機能を残すことにしました。

    (2) 広告はいいとして、cookieが正しくブロックされているかどうかわからないのが問題。一応、WKWebViewの出口のdecidePolicyFor navigationActionやdidReceiveServerRedirectForProvisionalNavigation navigationで見ていますが、よくわかりません。