2017-02-14 3 views
0

Представляет модальный контроллер представления, в котором пользователь может ввести некоторую информацию, то при сохранении этой информации с помощью этой функции ...Ошибка при повторном представлении контроллера представления

func handleSave() { 

    guard let newProductUrl = NSURL(string: urlTextField.text!) else { 
     print("error getting text from product url field") 
     return 
    } 
    guard let newProductName = self.nameTextField.text else { 
     print("error getting text from product name field") 
     return 
    } 
    guard let newProductImage = self.logoTextField.text else { 
     print("error getting text from product logo field") 
     return 
    } 

    DispatchQueue.main.async { 
     self.productController?.save(name: newProductName, url: newProductUrl as URL, image: newProductImage) 
    } 


    // Present reloaded view controller with new product added 
    let ac = UINavigationController() 
    let pController = ProductController() 
    productController = pController 
    ac.viewControllers = [pController] 
    present(ac, animated: true, completion: nil) 

} 

... Я получаю ошибку в viewWillAppear из ProductController (контроллера, который представил модальный контроллер представления, и теперь пытается вернуться к)

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    guard let appDelegate = 
     UIApplication.shared.delegate as? AppDelegate else { 
      return 
    } 

    let managedContext = 
     appDelegate.persistentContainer.viewContext 

    let companyToDisplay = self.navigationItem.title! 

    let fetchRequest = 
     NSFetchRequest<NSManagedObject>(entityName: "Product") 

    fetchRequest.predicate = NSPredicate(format:"company.name == %@",companyToDisplay) 

    do { 
     products = try managedContext.fetch(fetchRequest) 
     print(products) 
    } catch let error as NSError { 
     print("Could not fetch. \(error), \(error.userInfo)") 
    } 
} 

ошибки: неожиданно нашел ноль в то время как разворачивание опционального, на линии . Как указать, что self.navigationItem.title, что он ищет (и отсутствует), является self.navigationItem.title контроллера, который отправил модальный вид?

Спасибо за любую помощь, я пытался разобраться в этой проблеме в течение нескольких дней и не могу понять это.

EDIT: Вот как я представляю вид модального AddProductController из моего ProductController

func presentModalView() { 

    let nc = UINavigationController() 
    let addProductController = AddProductController() 
    nc.viewControllers = [addProductController] 

    self.modalTransitionStyle = UIModalTransitionStyle.coverVertical 
    self.modalPresentationStyle = .currentContext 
    self.present(nc, animated: true, completion: nil) 
} 

EDIT: Ввод кода отправки блока:

DispatchQueue.main.async { 
     self.productController?.save(name: newProductName, url: newProductUrl, image: newProductImage) 

     let pController = ProductController() 
     self.productController = pController 
     self.navigationController?.pushViewController(pController, animated: true) 
    } 

ответ

0

Вот ваша проблема, вы настоящее время используются (Ac , анимированный: true, завершение: nil), чтобы перейти к этому представлению, поэтому эта презентация является модальной и нет навигационного контроллера. Вы должны использовать UINavigationController.pushViewController, чтобы представить представление, и таким образом вы получите navigationController.

Edit:

 let nc = UINavigationController() 
    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let addProductController = storyboard.instantiateViewController(withIdentifier: "addProductVC") 
    nc.viewControllers = [addProductController] 

    self.modalTransitionStyle = UIModalTransitionStyle.coverVertical 
    self.modalPresentationStyle = .currentContext 
    self.present(nc, animated: true, completion: nil) 

Только не забудьте установить идентификатор для addProductController в раскадровке, изменить раскадровку и идентификатор VC для ваших них.

Edit 2:

  let nc = UINavigationController() 
    let addProductController = ProductController() 
    addProductController.navigationItem.title = "Have a good one" 
    nc.viewControllers = [addProductController] 

    self.modalTransitionStyle = UIModalTransitionStyle.coverVertical 
    self.modalPresentationStyle = .currentContext 
    self.present(nc, animated: true, completion: nil) 
+0

Я изменил его на 'ac.pushViewController (pController, animated: true) ', и теперь я получаю сообщение об ошибке с ошибкой:« Однократное нажатие одного экземпляра диспетчера экземпляра не поддерживается » – d0xi45

+0

Вы не должны просто изменять одну вещь в своем коде, переключите ac на UINavigationController, если это не сработало, пожалуйста, скажите мне, чтобы отредактировать мой пост и поместить полный код –

+0

Я не уверен, что понимаю, что вы просите - 'UINavigationController.pushViewController (pController, animated: true)' не работает. – d0xi45

0

Проблема заключается в том, что блок внутри этого вызова:

DispatchQueue.main.async { 
    self.productController?.save(name: newProductName, url: newProductUrl as URL, image: newProductImage) 
} 

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

DispathQueue.main.async добавляет блок в очередь кода, который должен быть выполнен в какой-то момент в будущем - он не выполняется немедленно.

Чтобы исправить это, вам необходимо ввести код внутри блок отправки, который делает все, что должно произойти дальше. Это будет похоже на то, что у вас есть здесь:

// Present reloaded view controller with new product added 
let ac = UINavigationController() 
let pController = ProductController() 
productController = pController 
ac.viewControllers = [pController] 
present(ac, animated: true, completion: nil) 

Но вы, вероятно, хотите, чтобы очистить как/где вы создаете и отклоняя контроллеры просмотра - то, что вы здесь выглядит, как он будет излишне взгромоздить кучу контроллеров представлений.

+0

Да, это то, с чем у меня возникают проблемы. Я попытался поместить код внутри блока отправки, но все же получил ту же ошибку, о которой упоминалось в моем вопросе. Я отредактировал свой вопрос, чтобы показать новый код, который я попробовал (все еще привык к навигации по просмотрам и основным данным, поэтому, пожалуйста, дайте мне знать, если есть лучший способ сделать это) – d0xi45

+0

Трудно сказать, что вы пытаетесь не просматривайте весь код, но попробуйте перефразировать проблему, поэтому вы используете только один экземпляр ProductController. Не похоже, что вам нужно создавать новый каждый раз, когда вы что-то сохраняете. –

+0

Я знаю, извините, это большой учебный проект для меня, и я теряюсь в контроллерах/навигационных контроллерах. Я думал, что у меня есть только один экземпляр ProductController, а затем модальный вид 'AddProductController'. Я действительно смущен, что не могу объяснить это правильно ... Это проект, если вы хотите увидеть ошибку (коснитесь edit -> done-> нажмите на компанию и попробуйте добавить продукт, чтобы увидеть ошибку): https : //dl.dropboxusercontent.com/u/17411581/NavCtrl.zip – d0xi45

Смежные вопросы