Ошибка сбоя приложения Todo возвращается с NIL? Xcode - PullRequest
0 голосов
/ 29 июня 2018

Итак, я строю этот проект, который является приложением todo. и когда вы нажимаете на ячейку, ваш товар должен быть найден на ask.com. Теперь я продолжаю получать эту фатальную ошибку. И это проявляется как ноль в моей части кода Appurl, как вы можете видеть в моем коде. Когда я нажимаю на него в коде, он появляется как ноль, что странно. Более того, это приводит к сбою моего приложения. Исходный код был бы потрясающим. Я понятия не имею, как это исправить. все, что я знаю, это то, что ноль отображается в «Appurl». Фатальное сообщение об ошибке, которое появляется ниже, выглядит следующим образом. Я не нашел другого ответа на этот тип фатальной ошибки. «поток 1: фатальная ошибка: неожиданно обнаружен ноль при развертывании необязательного значения»

 import UIKit
  class NewTableViewController: UITableViewController, NewCellDelegate, {
var news:[News]!

override func viewDidLoad() {
    super.viewDidLoad()

    loadData()

    func loadData() {
        news = [News]()
        news = DataManager.loadAll(News.self).sorted(by: {$0.createdAt < $1.createdAt})
        self.tableView.reloadData()

    }

    @IBAction func Save(_ sender: Any) {
        let addAlert = UIAlertController(title: "ADD", message: "TODO", preferredStyle: .alert)
        addAlert.addTextField { (textfield:UITextField) in
            textfield.placeholder = "TODO"
        }

        addAlert.addAction(UIAlertAction(title: "Save", style: .default, handler: { (action:UIAlertAction) in
            guard let title = addAlert.textFields?.first?.text else {return}
            let newsave = News(title: title, completed: false, createdAt: Date(), itemIdentifier: UUID())
            newsave.saveItem()
            self.news.append(newsave)

            let indexPath = IndexPath(row: self.tableView.numberOfRows(inSection: 0), section: 0)

            self.tableView.insertRows(at: [indexPath], with: .automatic)


        }))

        addAlert.addAction(UIAlertAction(title: "Cancel", style: .cancel, handler: nil))

        self.present(addAlert, animated: true, completion: nil)

    }

};

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return news.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! NewTableViewCell
    cell.delegte = self

    let news = self.news[indexPath.row]

    cell.label.text = news.title

    return cell
}

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath){
        //getting the index path of selected row
        let indexPath = tableView.indexPathForSelectedRow

        //getting the current cell from the index path
        let currentCell = tableView.cellForRow(at: indexPath!) as! NewTableViewCell

        //getting the text of that cell
        let TODO = currentCell.label.text

     let appURL = NSURL(string: "https://www.ask.com/web?q=\
        (TODO))&o=0&qo=homepageSearchBox)")

    if UIApplication.shared.canOpenURL(appURL! as URL) {
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(appURL! as URL, options: [:], completionHandler: nil)
            } else {
                UIApplication.shared.openURL(appURL! as URL)
            }

        }
    }

1 Ответ

0 голосов
/ 29 июня 2018

Вам необходимо обработать появление пробелов и специальных символов, таких как + в строке URL,

Для обработки пространства

/**Handle occurance of space in given url string*/
class func handleSpaces(in urlString: String) -> String {
    return urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)!
}

Для обработки + символ,

/**Handle occurance of space in given url string*/
class func handlePlusSign(in urlString: String) -> String {
    return urlString.replacingOccurrences(of: "+", with: "%2B")
}

Чтобы избежать сбоев, вы должны использовать в своем приложении надлежащие условия сопротивления сбою, такие как if let и guard let,

1020 * например *

if let url = appURL {
    // Proceed to use this url
}

Ваш код станет,

    let indexPath = tableView.indexPathForSelectedRow
    //getting the current cell from the index path
    guard let currentCell = tableView.cellForRow(at: indexPath!) as? NewTableViewCell else {
        print("Can't get your cell")
        return
    }
    //getting the text of that cell
    guard  let todo = currentCell.label.text else {
        print("Error in getting todo string")
        return
    }

    var urlString = "https://www.ask.com/web?q=\(todo))&o=0&qo=homepageSearchBox)"
    urlString = urlString.addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed)! // Handle spaces in your `todo` string.

    guard let appURL = URL(string: urlString) else {
        print("Can't form url")
        return
    }

    if UIApplication.shared.canOpenURL(appURL) {
        if #available(iOS 10.0, *) {
            UIApplication.shared.open(appURL, options: [:], completionHandler: nil)
        } else {
            UIApplication.shared.openURL(appURL)
        }
    }

Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...