• Как создать несколько 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 комментария
  • Интернет на iOS не работает после переключения WIFI на другую точку доступа. Решение?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Давай думать. Посмотри в настройках модема службу DHCP, она раздает IP-ники. Проверь IP-ник в настройках телефона, попробуй для двух точек доступа зарезервировать конкретный IP для мобилки.

    Если не помогло, и с другими устройствами точки работать нормально, боюсь предположить что у тебя 5-ый / 6-ой / 7-ой айфон собранный из палок (реф короче). Тогда попробуй поставить бету 13.1, там как раз обновили прошивку модема. Вдруг поможет.

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

    Нужно больше инфо чтобы сказать что-то конкретнее.
    Ответ написан
    Комментировать
  • Как сохранить данные приложения?

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

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

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

    Если статические данные, создайте файл JSON.
    Ответ написан
    1 комментарий
  • Как решить проблему с публикаций appstore?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Ничего не сделать. Пробуйте с другого аккаунта. Ну или так
    Ответ написан
  • Как удалить кэш у пользователей приложения iOS при выпуске обновления?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Возможно вы изменили структуру БД и не сделали миграцию.

    Кэша, который мог бы навредить, нету в iOS разработке.
    Ответ написан
    3 комментария
  • Как лучше реализовать мобильное приложение?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Натив. Не нужны вам всякие эти кроссы.
    Ответ написан
    Комментировать
  • Можно ли установить язык показываемого 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 к примеру). Чтобы восстановиться из бэкапа, нужно открыть сохраненный файл.
    Ответ написан
    Комментировать
  • Apple developer Enterprise Program. Регистрация в программе?

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

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

    Проблема решаемая, намёк.
    Ответ написан
    Комментировать
  • Как называется белое наложение на фото и как его искать в поисковике?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Сделайте треугольник, добавьте градиент из белого цвета в белый с прозрачностью 35%. Скопируйте треугольник ещё раз и сместите вправо.

    Различные варианты можно получить комбинируя фигуры, положение, прозрачности и даже цвета.
    Ответ написан
    Комментировать
  • Можно ли написать плагин для Finder?

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

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Кодить можно. Настоятельно не советую связываться с хакинтошем.
    Ответ написан
  • Правильное скругление углов у кнопок,обьектов?

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

    5d05424245497153237334.png

    Еще одна причина, почему не нужно привязываться к цифрам - неизвестный размер кнопки. На скриншоте высота 80px и закругление 20, но для высоты 500px закругление в 20px будет выглядеть совсем по другому. Приведу пример, размер шрифта оставлю без изменений:

    5d05431be3d44083282864.png
    Ответ написан
    2 комментария
  • Можно ли как то избавиться от постоянного reject 4.3 SPAM?

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

    В письме акцент на авторские права. Возможно вопрос к аудио. Подтверждаете что ничьи авторские права не нарушаете и все. Можно прикрепить ссылку, где автор лицензировал свое творчество под MIT и любой другой правильной лицензией.

    Реджекты по 4.3 всегда боль и отчаяние. Внятного решения нет. (невнятные есть) Есть предположение, что Apple сама не знает за что отклоняет, поэтому использует лазейку с 4.3.
    Ответ написан
  • Как получить стиль 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". Варнинги должны не нравиться)
    Ответ написан
  • Есть ли правильная структура файлов проекта?

    ivanvorobei
    @ivanvorobei
    iOS разработчик, канал https://t.me/sparrowcode
    Зависит от архитектуры. Если проект не сложный, начните с разделения вьюх, моделей и контроллеров.
    Для своих проектов достаточно.

    Полиции нравов, которая проверит порядок папок нету. С опытом придет понимание зачем так делать и потребность в более сложных паттернах / архитектурах.
    Ответ написан