メモ > 技術 > IDE: Xcode > UIKit
UIKit
■初期コード
「Swift + Storyboard」での初期コードは以下のとおり
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
}
■ボタンを配置&タップでアラート表示
Storyboardで画面にボタンを配置し、そのボタンをタップしたときにアラートを表示するコード例は以下のとおり
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var button: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
@IBAction func tapButton(_ sender: Any) {
let alert = UIAlertController(title: "タイトル", message: "メッセージ", preferredStyle: .alert)
let ok = UIAlertAction(title: "OK", style: .default) { (action) in
self.dismiss(animated: true, completion: nil)
}
let cancel = UIAlertAction(title: "キャンセル", style: .cancel) { (acrion) in
self.dismiss(animated: true, completion: nil)
}
alert.addAction(cancel)
alert.addAction(ok)
self.present(alert, animated: true, completion: nil)
}
}
■UIViewとUIViewController
UIView
画面部品を作る
矩形領域を表示する機能を持ったクラス
UIViewおよび、そのサブクラスを用いて画面を構築する
UIViewController
画面を管理する
Viewのライフサイクルの管理と画面遷移の機能を持つクラス
viewDidLoadやviewWillAppearなどのメソッドが用意されており、必要に応じてそれらの中に処理を記述する
iOS開発の知識
https://zenn.dev/tishii2479/scraps/54e81c0e347cc9
【Swift/UIKit】UIViewControllerの役割とは?ビュー階層とviewDidLoadメソッド
https://tech.amefure.com/swift-uikit-uiviewcontroller
■画面の向き
ViewControllerごとに画面の向きを固定する - Qiita
http://qiita.com/masapp/items/38ed20b27dcc09c24cba
■パスの確認
※パスは下のように取る?
[0]ではなくlastとか使う方がいい?
let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
/*
// パスの確認
let documentDirPath = NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true)
print(documentDirPath)
*/
■WebViewでWebページを表示
※これからはWebViewではなくWKWebViewが推奨される
ストーリーボードにWebViewを配置する
webViewという名前でOutlet接続する(名前は任意)
あらかじめWebKitを読み込む
import WebKit
以下のコードでAppleのサイトを表示できる(「@IBOutlet」はOutlet接続によって追加されたコード)
@IBOutlet weak var webView: UIWebView!
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: "https://www.apple.com/jp/")
let myRequest = URLRequest(url: myURL!)
webView.loadRequest(myRequest)
}
■WKWebViewでWebページを表示
※これからはWebViewではなくWKWebViewが推奨されるが、現時点では問題も多いので注意
WKWebViewをストーリーボードで配置すると問題が多いので、コードで扱う必要があるかもしれない
WKWebViewと向き合ってみた - Qiita
https://qiita.com/UJIPOID/items/fd4b33cac48ad37733f5
「iOS11未満もサポートする場合はコードでWKWebViewを実装する必要がある」
以下はストーリーボードで実装する例
ストーリーボードにWKWebViewを配置する
webKitViewという名前でOutlet接続する(名前は任意)
あらかじめWebKitを読み込む
import WebKit
以下のコードでAppleのサイトを表示できる(「@IBOutlet」はOutlet接続によって追加されたコード)
@IBOutlet weak var webKitView: WKWebView!
override func viewDidLoad() {
super.viewDidLoad()
let myURL = URL(string: "https://www.apple.com/jp/")
let myRequest = URLRequest(url: myURL!)
webKitView.load(myRequest)
}
■WebViewのキャッシュをクリア
WebViewのキャッシュは強力で、アプリを再起動しても古い情報を読み続けることが多い
プログラムで対応することもできるようだが、なかなか厄介そう
原則としてページをPHPで作成し、CSSファイルなどは「?20180816」のような文字列を付けて読み込む…とするのが安全そう
UIWebViewを使うときに気をつけていること - Qiita
https://qiita.com/urouro_n/items/d4e5fb66f2039090000f
■WebViewの長押しメニューを制御
UITextfieldやUIWebViewの長押しメニューが英語になる場合の解決法 | イリテク
https://iritec.jp/web_service/7326/
WKWebView でテキスト選択禁止や長押しによるメニュー表示禁止(TouchCallout)など | MUSHIKAGO APPS MEMO
https://mushikago.com/i/?p=8385
■Web上の画像を表示
@IBOutlet weak var myImageView: UIImageView!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let url = URL(string: "https://pbs.twimg.com/media/DGynUZqV0AAK9aq.jpg")
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
if error == nil {
if let dlImage = UIImage(data: data!) {
self.myImageView.image = dlImage
}
} else {
print("error")
}
}
task.resume()
/*
// 以前の書き方
var myURL = NSURL(string: "https://pbs.twimg.com/media/DGynUZqV0AAK9aq.jpg")
var myData = NSData(contentsOfURL: myURL)
var myImage = UIImage(data: myData)
myImageView.image = myImage
*/
}
■ローカルファイルを扱う
override func viewDidLoad() {
super.viewDidLoad()
/*
// ディレクトリを作成
let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
if (FileManager.default.fileExists(atPath: documentPath + "/test")) {
print("ディレクトリはすでに作成されています")
} else {
do {
try FileManager.default.createDirectory(
atPath: documentPath + "/test",
withIntermediateDirectories: false,
attributes: nil
)
print("ディレクトリ作成成功")
} catch let error as NSError {
print("ディレクトリ作成エラー")
}
}
*/
/*
*/
// ファイル・ディレクトリを一覧表示
let documentPath = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
var file_names: [String] {
do {
return try FileManager.default.contentsOfDirectory(atPath: documentPath)
//return try FileManager.default.contentsOfDirectory(atPath: documentPath + "/test")
} catch {
return []
}
}
let fm = FileManager()
for file_name in file_names {
var isDir = ObjCBool(false)
let isExist = fm.fileExists(atPath: documentPath + "/" + file_name, isDirectory: &isDir)
if isDir.boolValue == true {
print("dir=" + file_name)
} else if isExist {
print("file=" + file_name)
} else {
print("nodata=" + file_name)
}
}
/*
// ファイルのテキストを表示
let file_name = "data2.txt"
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let path_file_name = dir.appendingPathComponent(file_name)
do {
let text = try String(contentsOf: path_file_name, encoding: String.Encoding.utf8)
print(text)
} catch {
print("NG")
}
}
*/
/*
// ファイルにテキストを保存
let file_name = "data1.txt"
//let file_name = "test/data3.txt"
let text = "abcd1234"
if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
let path_file_name = dir.appendingPathComponent(file_name)
do {
try text.write(to: path_file_name, atomically: false, encoding: String.Encoding.utf8)
print("OK")
} catch {
print("NG")
}
}
*/
}
■設定画面を作る
UITableView + Static Cellsでアプリ内設定画面を作成するサンプル(XCode9, Swift4, StoryBoard使用) - Androidはワンツーパンチ 三歩進んで二歩下がる
https://sakura-bird1.hatenablog.com/entry/2018/03/09/014455
UITableViewControllerのStatic Cellsをカスタマイズしてアプリの設定画面を作る - Qiita
https://qiita.com/KikurageChan/items/08844e4eee774da992db
■ハンバーガーメニューを作る
[Tips]ハンバーガーメニューを作成するには? - Swift Life
http://swift.hiros-dot.net/?p=377
【iOS】ハンバーガーメニューの作り方 - Qiita
https://qiita.com/takehiro224/items/dc5903ae42f288ccd5f7
■Delegateとは何か
プロトコルとデリゲートのとても簡単なサンプルについて - Qiita
https://qiita.com/mochizukikotaro/items/a5bc60d92aa2d6fe52ca
SwiftにおけるDelegateとは何か、なぜ使うのか - Qiita
https://qiita.com/st43/items/9f9990d76cefa1909ef4
■オプショナル
【Swift入門】オプショナル(Optional)型の基本を徹底解説! | 侍エンジニアブログ
https://www.sejuku.net/blog/35070
SwiftのOptional型を極める - Qiita
https://qiita.com/koher/items/c6f446bad54442a28bf4
【Optional型】アンラップの仕方や非Optional型との違い
https://tech-maga.com/swift-optional
以下、unwrapの例
var year = 0
if let yearData = yearString as? Int {
year = yearData
}
以下のように書くこともできる
var year = Int(yearString) ?? 0