Как предотвратить ошибку во время выполнения SWIFT 4.2, если раскадровка не найдена или еще не создана? - PullRequest
0 голосов
/ 13 ноября 2018

Я прохожу 30-дневный курс по изучению SWIFT 4.2, и у стартового проекта есть табличное представление для демонстрации 30 приложений, по одному в день. Итак, существуют раскадровки для конкретного дня.

Вот код:

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    @IBOutlet weak var tableView: UITableView!
    var dataModel = NavModel.getDays()

    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.delegate = self
        tableView.dataSource = self
        navigationItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItem.Style.plain, target: nil, action: nil)

    }

    // MARK: uitableview delegate and datasource
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        print ("This is dataModel.count: ", dataModel.count)
        return dataModel.count

    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell") as! ContentTableViewCell
        cell.data = dataModel[indexPath.row]
        print(cell.data!)
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        let dayCount = dataModel[indexPath.row].dayCount
        print("This is dayCount: ", dayCount)
        let initViewController = UIStoryboard(name: "Day\(dayCount)", bundle: nil).instantiateInitialViewController()
        self.navigationController?.pushViewController(initViewController!, animated: true)

    }
}

Как мне обновить этот фрагмент кода:

let initViewController = UIStoryboard(name: "Day\(dayCount)", bundle: nil).instantiateInitialViewController()

чтобы предотвратить сбой приложения, если приложение не может найти конкретную раскадровку, которая еще не существует?

Вот код для NavModel.swift:

import UIKit 

class NavModel { 

    var dayCount: Int 
    var title: String 
    var color: UIColor 

    init(count: Int, title: String, color: UIColor) { 
        self.dayCount = count 
        self.title = title 
        self.color = color 
    } 

    class func getDays() -> [NavModel] { 
        var model = [NavModel]() 
        for i in 1...30 { 
            let nav = NavModel(count: i, title: "Day (i)", color: UIColor.randomFlatColor()) 
            model.append(nav) 
        } 
        return model 
    }
}

1 Ответ

0 голосов
/ 13 ноября 2018

Вы не можете предотвратить сбой этого кода. Невозможность найти раскадровку, на которую ссылаются, - фатальная ошибка, которая не может быть поймана.

Ссылка на раскадровку, которая не входит в ваш пакет, - это то, о чем вы хотите знать во время тестирования.

Подходящим решением является изменение модели данных, чтобы она содержала только те данные, для которых у вас есть раскадровки. то есть, если сегодня день 10, то NavModel.getDays() должен вернуть только 10 элементов данных.

Я переписал бы NavModel как:

import UIKit

struct NavModel {

    let dayNumber: Int
    var title: String {
        get {
            return "Day \(dayNumber)"
        }
    }
    let color: UIColor


    static func getDays(count: Int) -> [NavModel] {
        var model = [NavModel]()
        for i in 1...count {
            model.append(NavModel(dayNumber: i, color: UIColor.randomFlatColor()))
        }
        return model
    }
}

А затем создайте модель как, скажем, NavModel.getDays(count:10)

...