Ответы пользователя по тегу Swift
  • Как делать авторизацию в IOS приложении, с использованием биометрию?

    Loriens
    @Loriens
    iOS Developer
    Logging a User into Your App with Face ID or Touch ID

    Там же простой проект с реализацией.
    Ответ написан
    Комментировать
  • Как закрыть UIAlertController?

    Loriens
    @Loriens
    iOS Developer
    Перемести appDelegate.getApiService(...).getRequests(...) во viewDidAppear. Present view controller'a не должен вызываться во viewDidLoad.

    Нашёл здесь - ответ на StackOverflow
    Ответ написан
    1 комментарий
  • Где моя ошибка при делегирование?

    Loriens
    @Loriens
    iOS Developer
    Ошибка, скорее всего, здесь:
    var mainController = MainViewController()

    Так как вы используете segue, подозреваю, что ваш контроллер создан в сториборде. А вызов MainViewController() создаёт новый контроллер, который нигде не отображается.

    Вы должны установить делегат в prepare for segue в классе MainViewController:
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if let destination = segue.destination as? SecondViewController {
            self.delegate = destination
        }
    }


    Также нужно использовать слабую ссылку на делегата, чтобы избежать retain cycle:
    weak var delegate: MainViewControllerDelegate?

    P. S. Лучше добавить больше кода, потому что непонятно, где конкретно вы вызываете функцию делегата. Эта фраза ни о чём не говорит:
    можно ли вызывать метод делегата из override

    Ключевое слово override может много где появляться.
    Ответ написан
    1 комментарий
  • Как решить проблему с потоками при обработке данных?

    Loriens
    @Loriens
    iOS Developer
    Вообще твой вариант должен работать. Когда ты вызываешь `cartCV.reloadData()`, collection view перерисовывается.

    Во-первых, задал ли ты data source и delegate для collection view? В коде этого нет, но может ты сделал это в сториборде. В коде это выглядело бы так:
    override func viewDidLoad() {
        super.viewDidLoad()
        cartCV.dataSource = self
        cartCV.delegate = self
        dataProcessing()
        print(imageArr.count)
    }


    Во-вторых, `cell.cartImageView.image = UIImage(data: try! Data(contentsOf: imageUrl!))` - очень плохо. Это будет выполняться в главном потоке, соответственно, приложение будет заморожено на момент загрузки картинок. Нужно делать это асинхронно. Желательно избегать force unwrapping. Например, так:
    DispatchQueue.global().async {
        if let imageUrl = imageUrl,
            let data = try? Data(contentsOf: imageUrl) {
            DispatchQueue.main.async {
                self.cell.cartImageView.image = UIImage(data: data)
            }
        }
    }

    Такое решение костыльное, но я просто как пример пишу. Подгрузка data должна быть не в главном потоке, а обновление изображения в главном.

    Также есть хорошая либа для асинхронной подгрузки картинок - Kingfisher. C ней подгрузка изображения выглядела бы так:
    cell.cartImageView.kf.setImage(with: imageUrl)
    Ответ написан
    1 комментарий
  • Как перезагрузить UITableView после dismiss другого ViewController'a?

    Loriens
    @Loriens
    iOS Developer
    Есть много способов это сделать.

    Самый простой - обновлять таблицу при появлении CategoriesViewController:
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        tableView.reloadData()
    }


    Если нужно дополнительно добавлять какую-то информацию из AddCategoryVC, можешь держать CategoriesViewController в качестве делегата внутри AddCategoryVC. Для этого:
    1) Описываешь протокол для делегата:
    protocol AddCategoryVCDelegate: AnyObject {
        func addCategoryDismissed()
    }

    2) Хранить в AddCategoryVC делегата (его нужно будет задать при создании контроллера, это будет твой CategoriesViewController):
    weak var delegate: AddCategoryVCDelegate?
    3) И вызывать его в dismiss completion:
    dismiss(animated: true) {
        self.delegate?.addCategoryDismissed()
    }
    Ответ написан
    3 комментария