Ответы пользователя по тегу Swift
  • Как в iOS 13 переодически проверять базу и отправлять User Notification?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    После закрытия приложения, в методе applicationDidEnterBackground перебирайте по базе элементы, и выставляете локальные пуш-уведомления. Здесь же можно обновить бейдж, если он используется.
    Помните про ограничение 64 пуша, если нужно больше - свой бекенд.

    Будить через BackgroundTask ради уведомлений не стоит)
    Ответ написан
  • Как на swift установить мелодию в качестве звонка?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Таких методов нет. Пользователю придется делать руками.
    Но вы можете добавить файл мелодии в FileManager, чтобы облегчить пользователю установку через настройки.
    Ответ написан
    2 комментария
  • В чем разница в объявлении обобщенного типа в Swift?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    В том виде, в котором вы их привели, функции не отличаются.
    Параметр справа уточняет тип T, в туториалах это называют ограничением типа.

    static func max1<T:Comparable>(a: T, b: T) -> T {
         return a < b ? b : a
    }
        
    static func max2<T:Comparable>(a: T, b: T) -> T where T : Equatable {
         return a < b ? b : a
    }
    Ответ написан
    Комментировать
  • Как сделать view child vc как на скриншоте?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    На скриншоте у вас просто пуш нового контроллера, уверен вы умеете это делать.

    Наверное. вы хотите показать модальный контроллер поверх родителя с настраиваемой анимацией? Вам нужно реализовать UIViewControllerTransitioningDelegate . У него прекрасное разделение на лейаут, анимации и время жизни.
    Первые ссылки из гугла по теме: тыц, тыц и тыц.

    Год назад я делал кастомную презентацию для контроллеров, можете глянуть код на GitHub.

    Если я не правильно понял что вы хотите сделать, сформулируйте подробнее.
    Ответ написан
  • Как сделать прокрутку как в TableView но горизонтальную?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Вам нужно использовать не таблицу, а UICollectionView. Подробнее на сайте эпл.

    Размеры ячейки определяются лейаутом, это объект класса UICollectionViewLayout. Если хотите скейлить ячейки к центру, так же настраивается в лейауте. Система переиспользования аналогична таблице.
    Ответ написан
    5 комментариев
  • Как сделать разные значение в uitableview cell?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Скорее всего вам нужно обрабатывать метод didSelectRowAt протокола UITableViewDelegate.

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
         switch indexPath.row {
         case 0:
             // Сделать что-то по нажатию на ячейку с индексом 0
             break
         case 1:
             // Сделать что-то по нажатию на ячейку с индексом 1
             break
         default:
             break
         }
    }


    Больше можно глянуть в моем видео про таблицы.
    Ответ написан
  • UITableView прыгают изображения полученные с сервера?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Это система переиспользования. Вытягивается готовая ячейка и конфигурируется в методе. У меня есть видео об этой проблеме, глянуть можно тут. В видео я рассматривал трабл на примере чекмарка, но ситуация справедлива для любых элементов. Ячейку нужно конфигурировать однозначно.

    Вытекающая проблема — повторная загрузка картинки. Если для ячейки с индексом 2 инфицировали загрузку изображения, а ячейка 3 была сделана из копии 2, то картинка будет установлена и для третьей ячейки. Вам нужно объявить параметр индекса в ячейке и перед установкой картинки или стартом загрузки убедится что индекс правильный.

    Система переиспользования не сложная штука. Аналогичный принцип работает и в коллекциях.
    Ответ написан
    3 комментария
  • Как правильно распарсить коллекцию Json?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Я его получаю в другом порядке, и иногда этот порядок меняется

    JSON не гарантирует порядок доставки элементов массива. Вам нужно добавить правило сортировки.

    Хотелось бы все сделать через SwiftyJson

    Через SwiftyJSON нужно получить массив, выглядит это будет так:
    json["result"].arrayValue
    Ответ написан
  • Как в функции с помощью Switch перевести массив из Int -> String?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Что делает строчка:
    let array = [1...9]

    Не понял про перевод в массив. В примере кода вы просто выводите значения. Если я неправильно понял ваш вопрос - уточните.
    Но неважно, давайте перейдем к костылям.

    Делаем через функцию:
    func switchUp(_ value: Int) -> String? {
            guard value > 0 && value < 10 else { return nil }
            switch value {
            case 1:
                return "Один"
            case 2:
                return "Два"
            default:
                return nil
            }
    }


    Другой вариант костыля:

    enum LocalizedValue: String {
            case 1 = "Один"
            case 2 = "Два"
            case 3 = "Три"
    }
        
    let string = LocalizedValue.1.rawValue


    Если не забывать про локализацию, можно сломать голову (род существительных, число и прочее). Но как я понимаю, вам не для локализации, а для разового эксперимента. Костыли подойдут.

    P.S. Используйте форматирование для кода.
    Ответ написан
    1 комментарий
  • Как лучше обновлять контент в приложении?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Не понятно какую проблему вы пытаетесь решить.
    1. Нагрузка на сервер - вряд-ли статическим JSON вы хоть как то упретесь в половину мощности даже самой дешевой виртуалки на DO.
    2. Оперативка девайса - жрется от http запроса? Один контейнер реалма сожрет больше, а запрос по БД улетит в 100 порядков выше с их lazy запросами.
    3. performFetchWithCompletionHandler не для вашей задачи.

    Чтобы сформулировать проблему, нужно определить:
    • Насколько в актуальном состоянии должна быть информация (минута / месяц)
    • Насколько оперативно она должна доставляться (перед запуском, в основном потоке после запуска, в фоне после запуска, когда угодно),
    • На какие расходы вы готовы пойти (готов купить каплю на DO за 5$)

    Обновлю ответ после вашего комментария.
    Ответ написан
    4 комментария
  • Как создать несколько UIView через цикл?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Так как вы написали:

    Пытаюсь разобраться в разработке интерфейсов под Ios

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

    Назовем один товар ячейкой. Если ячейка должна занимать весь экран от края до края по ширине - используйте UITableView (называют таблицей), если ячеек по ширине может быть несколько - используйте UICollectionView (называют коллекцией).

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

    Метод для количества элементов в таблице:
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int

    Как видите, возвращает целое число.

    Метод для возрата вью, для таблицы вернуть объект UITableViewCell:
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell

    Просто UIView вернуть нельзя, она не реализует протокол для переиспользования. Но в UITableViewCell можно положить любые вью, которые вы хотите. Это своего рода контейнер. Перед использованием класса ячейки, нужно зарегистрировать класс.

    На моем канале есть ролик про переиспользование в таблице. На сайте эпл можно почитать про таблицу и коллекцию.

    Это основная концепция. Вам предстоит узнать что такое DataSource, Delegate, размеры, Layout (для коллекции). Не пугайтесь, про это написано много туториалов даже на русском.

    P.S. Автор захотел решить задачу с помощью цикла и кодом, привожу пример:
    Вынесем значение Y за цикл. Можно объявить здесь же параметры высоты и ширины:
    var currentY: CGFloat = 0
    let width: CGFloat = 375
    let height: CGFloat = 100
            
    for i in 0...3 { 
    
    }

    В цикле будем генерировать вью и ее настраивать. Лейаут subviews можно сделать там же:
    for i in 0...3 {
                var view = UIView()
                view.frame = CGRect.init(x: 0, y: currentY, width: width, height: height)
                currentY += view.frame.height + 10
    }

    Я приведу только генерацию вьюхи. Как размещать элементы внутри вы уже знаете. 10 - это отступ между вьюхами.
    Ответ написан
    2 комментария
  • Как сохранить данные приложения?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Зависит от данных.

    Если есть намеки на модель данных, используйте БД. Я люблю Realm (плюшками будут CloudKit из коробки и много чего другого).

    Если сохраняете флаги (прошел туториал / нет), используйте UserDefaults. Можно настроить синхронизацию между устройствами.
    Устанавливается значение в одну строчку:
    UserDefaults.standard.set(true, forKey: "example_flag")

    Если статические данные, создайте файл JSON.
    Ответ написан
    1 комментарий
  • Можно ли установить язык показываемого ViewController вне зависимости от языка устройства?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Код:

    func getFrenchString(forKey key: String) -> String {
        if let currentLanguage = (NSUserDefaults.standardUserDefaults().arrayForKey(AppleLanguages)?.first as? String) {
            if currentLanguage == "fr" {
                return NSLocalizedString(key, comment: "")
            }
            else {
                //the application is not currently on `fr`
                //change application to `fr`
                NSBundle.setLanguage("fr")
    
                //get the localized string on `fr`
                let frString = NSLocalizedString(key, comment: "")
    
                //return the application to the old language
                NSBundle.setLanguage(currentLanguage)
    
                return frString
            }
        }
    
        return ""
    }


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

    Уверен, сможете сделать метод универсальным: к примеру, чтобы получал идентификатор локали как параметр в методе.
    Ответ написан
    Комментировать
  • Каким образом реализовать хранение данных в мобильном приложении ios с вопросами и ответами на них?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Конечно JSON, даже не сомневайся.
    Архитектура правильная, чуть шлифануть:

    {
       "id": "1", //  всё отлично
       "title": "Какой формы земля?", // можно question
       "type": "buttons", // Если это стиль отображения, тогда сделай массив. Если тип вопроса - всё ок
       "answers" {
          "correct": "Плоская"
          "incorrect": ["Круглая", "Квадратная", "Ромбовидная"]
       }
    }


    Для ответов обновил иерархию, неправильные ответы в массив. Правильные ответы хорошо бы тоже в массив.

    UPD2:
    А где правильнее хранить json файл?

    Если вопросы добавлять редко, то локально. Ради потенциальной возможности исправить ошибку мучать http не стоит)
    Ответ написан
    3 комментария
  • Кто-нибудь кто сейчас работает с SwiftUI, как у вас с мощностями в плане работы в realtime?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    У меня FPS выше, чем на симуляторе. Местами лагает.
    Прошка 18ого на i5
    Ответ написан
    Комментировать
  • Как получить файл из Realm?

    ivanvorobei
    @ivanvorobei Автор вопроса
    iOS разработчик, канал https://t.me/sparrowcode
    Делаем объект Data:

    let data = try Data(contentsOf: realmURL)

    realmURL в моем случае это fileURL из вопроса.
    Сохраняем с расширением:

    guard let shareFile = data.toFile(fileName: "debt-backup", extenshion: "debt") else { return }


    Метод toFile:

    func toFile(fileName: String, extenshion: String) -> URL? {
            
            if let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first {
                
                let fileURL = directory.appendingPathComponent(fileName + "." + extenshion)
                
                do {
                    try self.write(to: fileURL)
                    return fileURL
                }
                catch {
                    print("Error writing the file: \(error.localizedDescription)")
                }
            }
            
            return nil
        }
    Ответ написан
    Комментировать
  • Как сделать бэкап Realm БД в файл на Swift?

    ivanvorobei
    @ivanvorobei Автор вопроса
    iOS разработчик, канал https://t.me/sparrowcode
    Если URL для Realm выглядит так:

    FileManager.default
                .containerURL(forSecurityApplicationGroupIdentifier: self.identificator)!
                .appendingPathComponent("default.realm")


    То получить объект Data не сложно:

    let backup = try Data(contentsOf: realmURL)

    Дальше Data можно записать куда-то, добавить ему расширение, выгрузить... тут по вкусу.

    Чтобы заменить базу данных Ream бэкапом, используйте:

    try backup.write(to: realmURL)

    Можно сохранить бэкап в файл, добавить расширение и предлагать пользователю сохранить файл (в iCloud Drive к примеру). Чтобы восстановиться из бэкапа, нужно открыть сохраненный файл.
    Ответ написан
    Комментировать
  • Можно ли написать плагин для Finder?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Расширения можно написать, но они работают как внешние приложения. К примеру - открыть терминал для текущей папки. Кастомизировать внешний вид Finder не получится.
    Ответ написан
    1 комментарий
  • Как получить стиль UITableView Cell с отступом в 15 и закругленными краями?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Вам нужно использовать UICollectionView.

    Автор вопроса хочет сделать коллекцию, но на базе таблицы. Такого инструмента для таблицы нет. Но можно костылить:
    • Установить для ячейки высоту на половину отступов больше, вью с контентом поместить по центру
    • Установить каждую ячейку в новую секцию, и задать отступ с помощью высоты headerView

    Сепаратор добавить линией в конце каждой ячейки. Или если хотите костыль - то в headerView для таблицы. То, что вы хотите сделать, в разы быстрее с помощью UICollectionView. Используйте коллекцию.
    Ответ написан
    5 комментариев
  • Почему в Swift вижу чаще использование let, чем var?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Компилятор ругнется мол "переменная не изменяется, используйте let". Варнинги должны не нравиться)
    Ответ написан