Memo

メモ > 技術 > 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

Advertisement