Ответы пользователя по тегу Objective-C
  • Почему при скроле таблицы данные в cell-e, который уходит из видимости, при возвращениий равен null?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Всё нормально с клетками, смотрите что вы делаете с массивом и что у вас в логах.

    По коду:
    Двойные пустые линии недопустимы.
    Вы создаете переменную myAnimal, но дальше продолжаете доставать объект из массива.
    MyAnimals* animal = ... <- bad
    MyAnimal *animal = ... <- good
    
    [_animalsArray objectAtIndex:indexPath.row] <- bad
    self.animalsArray[indexPath.row] <- good
    
    [[_animalsArray objectAtIndex:indexPath.row] photo] != NULL ? ... : ... <- bad
    self.animalsArray[indexPath.row].photo != nil ? ... : .... <- good
    self.animalsArray[indexPath.row].photo ? ... : .... <- better
    
    Избыточно:
    cell.textLabel.text = [[_animalsArray objectAtIndex:indexPath.row] name];
    cell.textLabel.text = [NSString stringWithFormat:@"%@",animal.name];
    
    Достаточно:
    cell.textLabel.text = animal.name;
    
    Где-то у вас:
    @property (nonatomic) NSArray *animalsArray; <- bad
    @property (nonatomic) NSArray *animals; <- good
    @property (nonatomic) NSArray<MyAnimal *> *animals; <- better
    Ответ написан
    Комментировать
  • Почему не получается задать новое значения переменной int?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Как ругается? Скопируйте ошибку.

    если
    _counter = [[_myArray count] intValue];
    то bad receiver type nsuinteger aka int

    Потому что intValue - метод, которого нет у простого типа nsuinteger
    Лечится 2мя способами
    1. Заведомо указать тип:
    self.counter = (int)[self.myArray count];
    2. Не использовать устаревший int, а использовать NSInteger, в конкретно вашем примере NSUInteger
    @property (nonatomic) NSUInteger counter;

    UPD. Личное мнение: если только начинаете, то начинайте со swift'а. По нему сейчас больше информации и он актуальнее.
    Ответ написан
    2 комментария
  • Как правильно инстанцировать и хранить ViewController-ы в iOS?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    В более идеальном мире у вас для каждого контроллера будет свой xib, в котором будет собственно и происходить layout. Такой подход отлично решает проблему мержей сторибордов.
    В итоге мы отказываемся от стринговых констант (viewControllerID). И тогда создание нового контроллера будет выглядеть вот так:
    let vc = MyViewController()
    Этот подход в свою очередь подталкивает нас к Dependency Injection.
    В итоге получаем удобное:
    let vc = MyViewController(dependency1: Dependency1, dependency2: Dependency2, ...)

    Но если зависимостей больше 2-3, то их удобнее выводить в отдельный settings-класс/структуру:
    let settings = MyViewController.Settings(<here init>)
    let vc = MyViewController(with: settings)

    В итоге смысла держать любую ссылку на контроллер нет.
    Ответ написан
    Комментировать
  • Как правильно писать на MVP?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Нужно определиться с "источником правды".
    В случае, когда приложение по сути тонкий клиент с кешовой прослойкой в виде собственной дата базы, мы обычно делаем сервер этим источником.
    Тогда модель приложение выглядит как-то так:
    Сервер -> Серверные сущности -> Сущности дата базы -> Дата база -> Экраны
    Соответсвенно все изменения данных происходят только ответом сервера. Нажал на кнопку "добавить в друзья"? Послал на сервер реквест, в ответе пришла обновленная сущность списка друзей, обновилась дата база, вьюшки получили нотификацию об обновление данных, перерисовались.

    К слову можно не напрягаться по поводу использования NSManagedObject потомков для настройки вьюшек, CoreData изначально создавалась для этих целей (Привет NSFetchedResultsController)
    Ответ написан
    Комментировать
  • Как сохранить navigationBar в UITabBarController?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Варианты:
    - кастомный navigationController, который сетапит айтемы при пуше
    - кастомный navigationBar который делает примерно тоже самое
    - кастомный viewController, который оверрайдит navigationItem и возвращает кастомный.
    В каждом варианте есть свои плюсы и минусы.

    Но если эти кнопки относятся не к текущему контроллеру, а к приложению в целом, то более логично оверрайднуть tabBarController, у которого изменить размеры childView и добавить свой navigationBar.
    Ответ написан
    Комментировать
  • Как можно получить эвент вызова dealloc у делегата?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    А зачем алерт, если нету делегата? Не вижу для этого адекватной причины.
    Ответ написан
    Комментировать
  • Как работать с AppDelegate, запакованным в framework?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Objc runtime.
    Класс можно получить таким способом если знаете имя делегата.
    Class appDelegate = objc_getClass("AppDelegate");

    Список строк в фреймворке можно получить через терминал
    strings CocoaLumberjack/CocoaLumberjack.framework/CocoaLumberjack
    Ответ написан
    3 комментария
  • Как можно держать приложение iOS в background и что бы оно не приостанавливалось?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    - location updates + setAllowBackgroundUpdates:YES - работает как надо, но очень жестоко выжирает батаре.

    С настройками локации пробовали играться? Меньше точность - меньше батареи.
    К тому же можно настраивать уведомления о изменении позиции на определенную величину.

    За использование вещей, которыми ваше приложение не пользуется, получите режект точно.
    Ответ написан
    2 комментария
  • Как выравнять левый край title по центру кнопки?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Не совсем уверен что у вас там.
    Но первое что приходит в голову, это отказаться от кнопок, запихнуть туда таблицу, нормально построить клетки, и ловить нажатие уже на клетки таблицы.
    Ещё вариант кастомные кнопки со своим лейаутом.
    Ответ написан
    1 комментарий
  • Как получить DeivceID (objective-c - IOS)?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Нельзя получить уникальный идентификатор для устройства никаким способом. Был способ раньше, но Apple его закрыл.
    То что вы нашли, это идентификатор для рекламодателей. Его можно использовать только, если в вашем приложении есть реклама. В противном случае вы не пройдете модерацию в App Store. И даже если есть реклама, там есть какие-то ограничения.

    Так что нужно делать что-то своё.

    UPD. Как вариант использовать NSUUID и сохранять его в keychain, он переживет удаление приложения. Но это не документированно, и возможно в будущем будет исправлено.
    Ответ написан
    2 комментария
  • Как сделать для таблицы несколько делегатов?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Если посмотрим в класс uitableview, то увидим, что делегат может быть один.
    Есть пути обхода, например сделать свой враппер, который будет в себе хранить несколько делегатов, и сам являться делегатом таблицы. При вызове метода таблицей, враппер будет вызывать этот же метод для всех остальных делегатов.
    Только это всё немного странно. Зачем вам это? Вполне возможно, что существуют более элегантные пути решения.
    Ответ написан
    Комментировать
  • Что означает Capturing 'self' strongly in this block is likely to lead to a retain cycle?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Компилятор вам говорит, что у вас есть ссылка на блок, а у блока есть ссылка на вас. В итоге АРС не сможет удалить эти два объекта и они будут вечно в памяти. Что в конечном итоге приводит к утечке памяти.
    Бороться можно:
    1) Убрав ссылку на блок, если она не критична, либо сделав её weak
    2) Передавать себя в блок по слабой ссылке:
    __weak MyClass *me = self;
    ... = ^() {
    [me.session ...];
    }
    Ответ написан
    2 комментария
  • Как перезапустить / полностью обновить ViewController?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Давайте угадаю. Все настройки происходят прямо в viewDidLoad?
    Ответ написан
    4 комментария
  • Как создать переход между ViewController по условию?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Кучу раз подымался вопрос переходов между экранами
    Как лучше всего передавать данные между ViewContoller'ами?

    UPD.
    1) Если контроллеры находятся в одном сториборде, то можно использовать self.storyboard
    2) Проверьте что у вашего вьюконтроллера действительно стоит это идентификатор
    3) Проверьте что текущий вьюконтроллер находиться в стеке навигейшин контроллера
    4) Используйте self.navigationController.pushViewController(vc, animated: true)
    Ответ написан
  • Как дождаться ответа от сервера (NSURLSession), чтоб потом отрисовать collection view?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    1) Показываем пустые данные / заглушку
    2) Посылаем запрос
    3) При ответе сервера релоудим коллецию
    4) ???
    5) PROFIT!!!

    Какие-то конкретные проблемы?
    Ответ написан
    Комментировать
  • Как работает sortedArrayUsingComparator?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    В obj1 и obj2 будут находиться какие-то два элемента массива. Вы должны в блоке определить порядок этих двух элементов. Соответсвенно массив вызовет этот блок для различных пар элементов.
    Ответ написан
    6 комментариев
  • Что требуется сделать в данном задании?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    нужно вывести
    n | n^2
    ------
    1 | 1
    2 | 4
    3 | 9
    и так далее
    Ответ написан
  • Почему конфликтует функция?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    Коротко: ObjC не поддерживает перегрузку методов, поэтому необходимо использовать различные имена для методов.

    Подробнее: Когда вы наследуете что-то от класса написанного на ObjC (в вашем случае это наверное UIViewController), класс автоматически становится совместимым с ObjC. Соответсвенно появляется 2 различных метода с одним и тем же селектором. Что плохо и вызывает ошибку компиляции.

    Возможные выходы из проблемы:
    1) Просто переименовать второй метод.
    2) (Если это всё таки UIViewController) Вынести логику приложения из её контроллера в модель. Соответсвенно создать класс, который будет производить все вычисления и не наследовать ничего от ObjC.

    ЗЫ Поэтому я считаю, что учить swift без objc бесполезно. Вам все равно приходиться писать с логикой objc, только словами свифта.
    Ответ написан
    1 комментарий
  • Нужно ли перед изучением objective-C, изучать C?

    ManWithBear
    @ManWithBear
    Swift Adept, Prague
    С чего лучше всего начать новичку в программирован...
    Новичок в программировании? Так начинайте с Си. Хорошенько поработаете с памятью, поучите алгоритмы по Кормену. Спустя 2 месяца можно будет переходить к обжективу. После Си будет удобно и легко. За пару месяцев разберетесь в основах обжектива и поработаете немного с основной библиотекой для ios UIKit и остальными. К тому времени можно наверное уже будет потихоньку переходить на свифт.
    Итого:
    1) Неделя на изучение основ Си
    2) 7 недель на изучение основных алгоритмов и основ алгоритмизации + работа с памятью и прочее и тому подобное. В общем основы программирования вообще.
    3) Основы обжектива 2-3 дня
    4) UIKit 2 месяца
    5) Основы свифта 2-3 дня
    6) Профит.
    Ответ написан
    Комментировать