Inputboxをalertで表示する

サンプル:alert表示のInputboxで現在のViewControllerのname属性を修正するロジック

let ac = UIAlertController(title: "New Name", message: "", preferredStyle: .alert)
        
let done = UIAlertAction(title: "Done", style: .default) { [weak self, weak ac](action) in
    guard let textFields = ac?.textFields else { return }
    for textField in textFields {
        if textField.tag == 1 {
            guard let newName = textField.text else { return }
            self?.name = newName
        }
    }
}
        
let cancel = UIAlertAction(title: "Cancel", style: .cancel, handler: nil)
        
ac.addTextField(configurationHandler: {(textField:UITextField!) -> Void in
    textField.text = self.name
    textField.tag  = 1
})

ac.addAction(done)
ac.addAction(cancel)
present(ac, animated: true, completion: nil)

xibで再利用可能のViewを作る

1、Command+Nで新規ファイルウィンドウを開く、中にUser Interface下のViewを新規する。新規したのはxibファイル。xibファイルの編集方法はStoryboardと大体同じ。 2、UIViewを継承して自分のViewクラスを作成、xibファイルを自分のサブビューとして追加する。 例:

import UIKit

class TeamPreviewView: UIView {
    let nibName = "TeamPreviewView" //xibファイルのファイル名
    
    required init?(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        commonInit()
    }
    
    override init(frame: CGRect) {
        super.init(frame: frame)
        commonInit()
    }
    
    func commonInit() {
        guard let view = loadViewFromNib() else { return }
        view.frame = self.bounds
        // 他のカストマイズ配置
        self.addSubview(view)
    }
    
    func loadViewFromNib() -> UIView? {
        let nib = UINib(nibName: nibName, bundle: nil)
        return nib.instantiate(withOwner: self, options: nil).first as? UIView
    }
}

3、xibファイルにFile's Ownerを項番2で作成のViewクラスを指定する。

FullScreenで次のViewを表示

Extension定義

extension UIViewController {
    func presentWithFullScreen<T: UIViewController>(storyboardId: String, handler: ((T) -> Void)?){
        let vc = self.storyboard?.instantiateViewController(identifier: storyboardId) as! T
        if let wrappedHandler = handler {
            wrappedHandler(vc)
        }
        vc.modalPresentationStyle = .overFullScreen
        vc.modalTransitionStyle = .coverVertical
        self.present(vc, animated: true)
    }
}

呼び出し例

presentWithFullScreen(storyboardId: "match") { (matchView: MatchViewController) -> Void in
    let myTeam = self.myTeamPreviewView.team!
    let enemyTeam = self.enemyTeamPreviewView.team!
    matchView.teams = [myTeam, enemyTeam]
}

DateFormatterを使ってDateをStringに変換

func formatDate(_ date: Date) -> String {
    let formatter = DateFormatter()
    formatter.dateStyle = .short
    formatter.timeStyle = .short
    return formatter.string(from: date)
}

dateStyleとtimeStyleはnone、short、medium、long、fullという選択肢がある。

ObservableObjectをCodableさせる

class Person: ObservableObject, Codable {
    @Published var name = ""
    @Published var age = 0

    enum CodingKeys: CodingKey {
        case name, age
    }

    init() { }
    
    required init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        name = try container.decode(String.self, forKey: .name)
        age = try container.decode(Int.self, forKey: .age)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(name, forKey: .name)
        try container.encode(age, forKey: .age)
    }
}