[iOS] plist에서 정보를 가져와 UITableView에 표시 in Swift3

11913 단어 iOSSwiftCarthageswift3
앱의 설정 정보를 저장하는 xxx.plist입니다만, 본래는 xml이므로 데이터를 추출해 앱의 UI에 표시할 수 있습니다.

어떤 때 필요



자신이 필요로 한 경우로서,
  • 소스와 함께 원격 저장소에 게시하지 않으려는 API 키를 로컬 plist에 저장하고로드합니다.
  • Carthage로 설치 한 라이브러리의 라이센스 정보를 앱에 표시합니다.

    때 필요했습니다.
    이번 2.의 경우에서 설명합니다.

    1. info.plist에서 데이터 추출



    Swift3 버전을.
    Swift2에서 상당히 쓰는 방법이 다릅니다.

    환경:
    Swift3.1
    Xcode8.3

    예) plist에 저장된 라이브러리의 라이센스 정보 얻기



    덧붙여서 Carthage의 라이센스 정보는 이 SwiftScript 에서 빼내면 편리합니다.

    이런 plist가 있습니다.



    꺼내십시오.
    import Foundation
    
    // plist名はtypoを防ぐためEnumで管理
    enum FileName: String {
        case key = "Key"
        case licenses = "Licenses"
    }
    
    // ライセンス構造体
    struct License {
    
        // ライセンス名を格納する配列
        var titles: [String] = []
    
        init?() {
            guard let licenses: [[String : Any]] = parsePlist(FileName.licenses) else {
                return nil
            }
            // ライセンス情報の配列からtitleだけ抜き出す。
            // flatMapを使えばnilを省いた配列を返してくれるので便利
            titles = licenses.flatMap { $0["title"] as? String }
        }
    
    
        // plistに保存しているライセンス情報をparseするメソッド
        private func parsePlist(_ fileName: FileName) -> [[String: Any]]? {
            // 何かしらparseに失敗したらnilを返す
            guard let filePath: URL = Bundle.main.url(forResource: fileName.rawValue, withExtension: "plist") else {
                return nil
            }
            do {
                let data = try Data(contentsOf: filePath)
                return try PropertyListSerialization.propertyList(from: data, options: [], format: nil) as? [[String: Any]]
            }
            catch {
                return nil
            }
        }
    }
    

    2. TableView에 라이센스 정보 표시



    License 구조의 title 속성만 표시합니다.
    
    import UIKit
    
    class LicensesViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
    
        @IBOutlet weak var tableView: UITableView!
        let license = License()
        var titles: [String] {
            return license?.titles ?? []
        }
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            tableView.separatorInset = UIEdgeInsets.zero
            tableView.delegate = self
            tableView.dataSource = self
    
            self.navigationItem.title = "Acknowledgements"
            self.tableView.backgroundColor = UIColor.bg
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            tableView.tableFooterView = UIView(frame: CGRect.zero)
        }
    
    
        // MARK: - TableView Delegate
        func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
            return titles.count
        }
    
        func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
            let cell = tableView.dequeueReusableCell(withIdentifier: "CustomCell")!
            cell.textLabel?.text = titles[indexPath.row]
            cell.accessoryType = .disclosureIndicator
            return cell
        }
    }
    

    할 수 있었다!





    참고 사이트



    【Swift】API 키를 scheme별로 나누면서 공개 리포지토리에 키를 공개하고 싶지 않을 때
    h tp : / / s t c ゔ rf ぉ w. 코 m / 쿠에 s 치온 s / 39910461 / 호 w - 토레 d f m m p st u th th su ft 3 - e s p p
  • 좋은 웹페이지 즐겨찾기