TIP-맥OS

macOS TableView와 NSArrayController사용하여 구현하기 - #1

무한열정 2017. 4. 16. 15:19

 

이글은 macOS용 TableView와 NSArrayController사용하여 구현하는 방법을 설명합니다.

iOS 아이폰용 설명이 아니니 오해 없으시기 바랍니다.

 

iOS개발관련 자료는 많지만 macOS개발 자료는 거의 없기도 하고

맥용 앱이 많아지기를 바라는 마음으로 글을 써봅니다.

저도 맥용 앱은 만들어 본적이 없어 스터디를 하고 있습니다. ^^;

 

MacOS Cocoa 프로그래밍은 책이 많지 않은데요.

Big Nerd Ranch의 Cocoa Programming for OSX ( 5th Edition )이 좋은거 같습니다.

이번 5판에서는 Swift기분으로 설명하는데 문제는 원서이고 번역서는 없습니다.

요즘 구글번역기가 인공지능이 적용되어 성능이 뛰어나니 활용하면 큰 문제는 없을듯 하구요. ^^;;;;

 

 

Xcode 메뉴에서 File > New > Project를 선택하고

macOS탭을 선탠한후 하단이 맥용으로 바뀌면 Cocoa Application을 선택합니다.

 

 

프로젝트명은 RaiseMan Create Document-Based Application을 선택합니다.

Language는 Swift로 하고 Document Extension은 이번에는 크게 의미는 없습니다.

전 그냥 mydoc라고 했구요.

* 책에서는 Use StoryBoard에 체크를 해제해서 xib를 사용하는 방식을 취하고 있는데

  허걱 Xcode 8.3.1로 업데이트 하고 나니 메뉴가 없네요. ㅜㅠ 

  뒤에가서 좀 두렵지만 플젝구조를 조금 바꿔 보도록 합니다. ^^;;;

 

 

적당한 디렉토리를 선택하고 저장합니다.

 

 

역시나 .stroryboard파일이 있네요. ㅋ

 

 

Document.swift를 선택하여

xib로 초기화 하여 화면을 띄우기 위해서 다음과 같이 코드를 수정합니다.

코드 변경이나 추가는 이게 마지막 입니다.

 

//

//  Document.swift
//  RaiseMan
//
//  Created by Nick Teissler on 2/16/15.
//  Copyright (c) 2015 Big Nerd Ranch. All rights reserved.
//


import Cocoa


class Document: NSDocument {


    var employees: [Employee] = []
    
    override init() {
        super.init()
        // Add your subclass-specific initialization here.
    }


    override func windowControllerDidLoadNib(_ aController: NSWindowController) {
        super.windowControllerDidLoadNib(aController)
        // Add any code here that needs to be executed once the windowController has loaded the document's window.
    }


    override class func autosavesInPlace() -> Bool {
        return true
    }


    override var windowNibName: String? {
        // Returns the nib file name of the document
        // If you need to use a subclass of NSWindowController or if your document supports multiple NSWindowControllers, you should remove this property and override -makeWindowControllers instead.
        return "Document"
    }


    override func data(ofType typeName: String) throws -> Data {
        // Insert code here to write your document to data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning nil.
        // You can also choose to override fileWrapperOfType:error:, writeToURL:ofType:error:, or writeToURL:ofType:forSaveOperation:originalContentsURL:error: instead.
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }


    override func read(from data: Data, ofType typeName: String) throws {
        // Insert code here to read your document from the given data of the specified type. If outError != nil, ensure that you create and set an appropriate error when returning false.
        // You can also choose to override readFromFileWrapper:ofType:error: or readFromURL:ofType:error: instead.
        // If you override either of these, you should also override -isEntireFileLoaded to return NO if the contents are lazily loaded.
        throw NSError(domain: NSOSStatusErrorDomain, code: unimpErr, userInfo: nil)
    }




}

 

 

Xib로 화면을 띄우는 경우는 MainMenu.xib가 있어야 하므로 New File을 선택해서 하나 만듭니다.

 

 

Main Menu라고 있죠? 선택하구요.

 

 

Main.storyboard는 필요없므로 삭제합니다.

 

 

좌측 파일 목옥에 맨위에 프로젝트명을 선택하면

아래 화면이 나오는데 General탭을 선택하고 Main Interface를 클릭하면

방금 생성한 Main Menu.xib가 보입니다. 바로 선택하시구요.

 

 

Document.swift의 UI부분을 만들기 위해 xib파일을 만듭니다.

마우스 오른쪽 버튼 클릭후 New FIle로 생성하시면 됩니다.

 

 

Document.swift 클래스에 대응하는 UI이므로

Document라는 이름으로 저장합니다.

 

 

Empty로 생성하다보니 휑~~~~하니 허허벌판 입니다.

일일이 목록에서 찾으면 힘드니 좌측 하단에 검색어를 넣어서 Window를 찾아서

드래그 해서 올려놓습니다.

 

 

Table View도 적당한 자리에 올려 놓습니다.

 

 

Buttion도 검색해서 올려 놓습니다.

목록에 Push Button UI가 맞습니다.

 

 

버튼 이름을 변경 합니다.

버튼 선택하고 Attributes Inspector를 선택한후 타이틀항목에서 변경하거나

그냥 버튼을 더블클릭하면 간편하게 바로 변경도 가능합니다.

 

 

이렇게 보이는지 확인합니다. ^^;

 

 

 

실행을 해봅니다.

플레이 버튼 모양의 아이콘을 실행하면 바로 구동이 됩니다.

 

 

잘 뜨네요. ㅋㅋ

 

내용이 길어 다음글에 작성합니다. ~