Расслабьтесь, переходя, не отказываясь от взгляда

Проблема:

Расслабьтесь, переходите, не упуская из виду, хотя это работает.

Сценарий:

У меня есть экран «добавить продукт», и когда продукт добавлен, я запускаю раздел «Раскрутка», который, в свою очередь, показывает всплывающее окно: «Новый продукт добавлен».

Факты: 1) Товар успешно добавлен в базу данных 2) всплывающее окно «Продукт добавлен» отображается в @IBAction сегмента раскрутки целевого объекта и появляется 3) Всплывающее окно «Продукт добавлен» отображается над представлением AddProductScreen.

Изображение 1: Существование перехода Unwind enter image description here

@IBAction, расположенный в целевом обзоре:

@IBAction func unwindFromAddProductViewSuccess(segue: UIStoryboardSegue)
    {
        AlertManager.showTimedAlert(title: "Success", message: "New Product added", timeShowing: 1, callingUIViewController: self)
    }

Функция, вызываемая в AddProductView для регистрации продукта:

private func registerProductAndPerformSegue(productToRegister prod: Product)
    {
        self.registerProduct(prodToRegister: prod)
        Constants.logger.debug("New product registered")
        self.performSegue(withIdentifier: "unwind_from_add_product_success", sender: self)

    }

В окне «Добавить продукт» после нажатия кнопки «Подтвердить» отображается предупреждение с надписью «Вы уверены?». а затем вам будет предложено нажать «Да» или «Нет».

Это код предупреждения:

AlertManager.ShowAlert(controllerToShowAlert: self, alertTitle: LocalizationStrings.Products.ADD_PRODUCT_TITLE, alertText: LocalizationStrings.Products.ADD_PRODUCT_CONFIRMATION,
                                           alertStyle: UIAlertControllerStyle.alert,
                                           leftButtonAction: UIAlertAction(title: LocalizationStrings.YES_TEXT, style: .default, handler:
                                            {
                                                (action: UIAlertAction!) in

                                                let user = Auth.auth().currentUser

                                                if let user = user
                                                {
                                                    let product : Product = Product(name: name!, price: Double(price!)!, currency: "USD", description: desc!,
                                                                                    location: "USA", ownerID: user.uid, ownerName: user.displayName!, uniqueID: "", mainImageURL: nil, category: category)


                                                    let storageRef = Storage.storage().reference().child(product.getUniqueID()).child("pic0.jpg")
                                                    if let mainChosenImage = self.selectedImageToUpload
                                                    {
                                                        Constants.logger.debug("Product picture chosen")
                                                        if let uploadData = UIImageJPEGRepresentation(mainChosenImage, 0.2)
                                                        {
                                                            storageRef.putData(uploadData, metadata: nil)
                                                            {
                                                                (StorageMetaData, error) in
                                                                if error != nil
                                                                {
                                                                    Constants.logger.error("Add Product: Couldn't store image in database!")
                                                                    return
                                                                }

                                                                self.mainImageURL = StorageMetaData?.downloadURL()?.absoluteString
                                                                if let urlString = self.mainImageURL
                                                                {
                                                                    product.AddImageURLToProduct(URL: urlString)
                                                                    self.registerProductAndPerformSegue(productToRegister: product)
                                                                }
                                                            }
                                                        }
                                                        else
                                                        {
                                                            Constants.logger.error("Couldn't convert uploaded image to UIImageJPEGRepresentation")
                                                        }
                                                    }
                                                    else
                                                    {
                                                        Constants.logger.debug("Product picture NOT chosen")
                                                        self.registerProductAndPerformSegue(productToRegister: product)
                                                    }
                                                }
                                           }),

                                           rightButtonAction: UIAlertAction(title: LocalizationStrings.NO_TEXT, style: .cancel, handler: { (action: UIAlertAction!) in
                                            print("Handle Cancel Logic here")
                                           }))

Что я здесь делаю не так?

Как вы попали на экран добавления продукции? Это был толчок или подарок?

Mr.P 10.09.2018 11:04

Я использую "толкать"

Ofri 10.09.2018 11:06

Да, довольно сложно точно знать, что происходит, не глядя на проект, но я бы сказал, что вы хотите начать извлекать материал, пока у вас не будет работать barebone-комплектов. Здесь довольно хороший пример, чтобы вернуться к основам и заставить все работать stackoverflow.com/a/40248196/3320342

Mr.P 10.09.2018 11:10

Я следил за ним, и разница в том, что я вручную активирую переход отмотки по идентификатору, так как у меня нет физической кнопки для «Добавить продукт», поскольку после того, как я нажимаю «Подтвердить загрузку», появляется другое всплывающее окно с «Вы? уверен? ДА / НЕТ "и только при" Да "он должен его запустить

Ofri 10.09.2018 11:26

Я добавил часть своей функции :) Пожалуйста, смотрите обновление

Ofri 10.09.2018 11:58
0
5
123
1

Ответы 1

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

Предполагая, что у вас есть два контроллера представления: FirstViewController andAddProductViewController , andAddProductViewController` представлен с помощью push-перехода.

Внутри FirstViewController у вас есть:

@IBAction func unwindFromAddProductViewSuccess(segue: UIStoryboardSegue) {
    AlertManager.showTimedAlert(title: "Success", message: "New Product added", timeShowing: 1, callingUIViewController: self)
}

Затем вы подключаете свою кнопку «сохранить» или «добавить» из AddProductViewController к методу действия unwindFromAddProductViewSuccess:.

Вы также можете подключить кнопку «сохранить» или «добавить» к SecondViewController, чтобы отладить, что вызывается переход:

class SecondViewController: UIViewController { 
    @IBOutlet weak var saveButton: UIBarButtonItem!

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        guard let uiBarButtonItem = sender as? UIBarButtonItem else {
            print("There is no UIBarButtonItem sender")
            return
        }

        if saveButton == uiBarButtonItem {
            print("save button tapped")
        }
        print("A segue with an identifier \(segue.identifier ?? "") was called.")
    }
}

Предполагая, что у вас нет кнопки на панели и вы хотите вызвать unwidnSegue вручную, возможно, после того, как пользователь нажмет на действие UIAlertController, вы можете сделать что-то вроде этого:

@IBAction func orderButtonTapped(_ sender: UIButton) {
    let alert = UIAlertController(title: "Order Placed!", message: "Thank you for your order.\nWe'll ship it to you soon!", preferredStyle: .alert)
    let OKAction = UIAlertAction(title: "OK", style: UIAlertActionStyle.default, handler: {
    (_)in
        self.performSegue(withIdentifier: "unwindToMenu", sender: self)
    })

    alert.addAction(OKAction)
    self.present(alert, animated: true, completion: nil)
}

Также бывают случаи, когда UIViewController, от которого вы пытаетесь расслабиться, находится внизу стека UINavigationController, в этом случае вызов unwindSegue ничего не даст. Ранее был похожий вопрос, связанный с этим, здесь.

Я надеюсь, что эта информация поможет вам разобраться в проблеме.

Я проверил обновленный код в исходном сообщении, и у меня есть сомнения, связанные с потоками. Можете ли вы проверить, может быть, registerProductAndPerformSegue вызывается в фоновом потоке? Обновление пользовательского интерфейса обычно в фоновых потоках может привести к неожиданному поведению. В качестве быстрой проверки, можете ли вы попробовать переключиться в основную очередь перед вызовом registerProductAndPerformSegue? Просто позвоните registerProductAndPerformSegue внутри обратного вызова DispatchQueue.main.async.

Mohammed Abdullatif 10.09.2018 14:08

Можете ли вы попробовать заменить эту строку: self.registerProductAndPerformSegue(productToRegister: product) на DispatchQueue.main.async { self.registerProductAndPerformSegue(productToRegister: product) }. Это гарантирует, что вызов unwindSegue произойдет в основном потоке.

Mohammed Abdullatif 11.09.2018 10:50

Это не сработало: / Я добавил: self.navigationController? .PopViewController (animated: true), и теперь он работает, но это я ...

Ofri 11.09.2018 19:24

Другие вопросы по теме