0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[macOS][cocoa][Swift]なかなか調べるのに時間がかかったりしたのでメモ

Last updated at Posted at 2020-12-08

忘れないようにメモ

個人的にアプリを作った際に調べたものをメモ.....φ(・∀・*)

スクロールビューの有効/無効を出来るようにする

class MyScrollView: NSScrollView {
    /// スクロール有効/無効
    var isScrollEnabled = true
    
    /// scrollWheel
    /// - Parameter event:
    override func scrollWheel(with event: NSEvent) {
        if self.isScrollEnabled {
            super.scrollWheel(with: event)
        }
    }
}

ESCをショートカットキーで利用する場合

他のアクションに繋いでも動かなくて悩みました。ESCキーはデフォルトで下記アクションが利用されるようで、overrideする事により出来るようになりました。

@IBAction override func cancelOperation(_ sender: Any?) {
}

presentAsSheet で呼び出したViewのサイズ固定

class MyViewController: NSViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        // サイズを固定
        self.preferredContentSize = self.view.frame.size
    }
}

NSWindow のフルスクリーン判定

extension NSWindow {    
    // フルスクリーン判定
    var isFullScreen: Bool {
        return self.styleMask.contains(.fullScreen)
    }    
}

メニューの有効/無効

NSMenuItemValidationプロトコルの実装を使う。

extension ViewController: NSMenuItemValidation {
    func validateMenuItem(_ menuItem: NSMenuItem) -> Bool {
        switch (menuItem.action) {
        // toggleSidebarメニューを条件によって有効/無効にする
        case #selector(NSSplitViewController.toggleSidebar(_:)):
            if self.hoge {
                return false
            } else {
                return true
            }
        default:
            return true
        }
    } 
}

オブジェクトをファイルへ保存

// NSConfig プロトコルを実装
class Entity: NSObject, NSCoding {
    var id: Int = 0
    var name: String = ""
    
    override init() {
        super.init()
    }

    required init?(coder: NSCoder) {
        self.id = coder.decodeInteger(forKey: "id")
        self.name = coder.decodeObject(forKey: "name") as! String
    }

    func encode(with coder: NSCoder) {
        coder.encode(self.id, forKey: "id")
        coder.encode(self.name, forKey: "name")
    }
}

// ファイルへ出力
var item: Entity(id: 1, name: "hoge")
NSKeyedArchiver.archiveRootObject(item, toFile: filePath)

// ファイルから読み込み
let readedItem = NSKeyedUnarchiver.unarchiveObject(withFile: filePath) as? Entity

他にも、あとで追記予定。。。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?