Ответы пользователя по тегу Objective-C
  • В каких случаях отменнее применять SQLite, а в каких Core Data?

    kaspartus
    @kaspartus
    Я бы в начальный уровень знания Core Data включил:
    - Знание основных элементов Core Data стека
    - Знание возможностей фреймвока(писать, например, можно не только в базу)
    - Умение писать/читать
    - Работа с простейшими свзяками

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

    Потом советую прочесть про NSFetchedResultsController, но в начале лучше почитать примеры без них.

    А так есть книжка "Pro Core Data for iOS", на хабре даже есть перевод первых 4 глав: habrahabr.ru/post/198242
    Ответ написан
    Комментировать
  • Как сделать переключатель между UITableView и UICollectionView?

    kaspartus
    @kaspartus
    Ну тут на свой вкус.
    - Можно положить UITableView и UICollectionView на одну вьюху и просто менять альфу.(Тут думаю и так все понятно)
    - Можно сделать красивый переход(гуглить "custom transition ios 7"), но это может поломать порядок UIViewController, если они лежат в UINavigationController.

    Из общих моментов:
    - Я бы вынес реализацию всех делегатных методов в отдельный класс, это сильно повысит читаемость класса UIViewController, которому они будут принадлежать.( www.objc.io/issue-1/lighter-view-controllers.html )
    - В качестве переключателя я бы использозвал UISegmentedControl, находящийся в верхнем баре, но никто не мешает придумать, что-то свое.
    Ответ написан
    Комментировать
  • Как лучше отфильтровать NSSDictionaty?

    kaspartus
    @kaspartus
    Я так понял, что в основном вопрос на тему выбора структуры сущностей. Для этого неплохо было бы увидеть сами запросы. Самое простое - это держать объект Предмет с полями: Название, Преподаватель, Кабинет/Место, Время начала, Продолжительность.

    Я бы напрямую биндил в сущности базы(с этой задачей отлично справится MagicalRecord), а далее уже фильтруем.

    Касательно фильтрации, как написал @morozovdenis, используется класс NSPredicate.

    Отдельно добавлю, что у любого фреймвока/либы для работы с базами уже наверняка есть встроенные возможности для фильтрации и сортировки, достаточно пробежаться по любому туториалу/докам.
    Ответ написан
    Комментировать
  • Как найти курсы программирования для начинающего IOS-разработчика в Киеве?

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

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

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

    Идеальный вариант: наличие наставника, который продумывает приложение, но не вытирает сопли по любому поводу, в совсем сложных вопросах готов все объяснить. Работа заключается в написании кучи небольших приложений разной тематики.
    Ответ написан
    1 комментарий
  • Какие есть Objective-C репозитории приложений с грамотной структурой кода и паттернами?

    kaspartus
    @kaspartus
    К книжкам частенько идет репозиторий на гитхабе, можно посмотреть там. Еще есть cookbook'и, там есть готовые решения для кучи проблем.

    Если хочется углубиться в патерны, поищите какую-нибудь advanced книжку, там как раз и занимаются тем, что пытаются не просто сделать, а сделать правильно и читаемо, показывают приемы, которые не используют в туториалах из серии "лишь бы работало".
    Ответ написан
    1 комментарий
  • Как передать управление нажатием на объект в основной контроллер?

    kaspartus
    @kaspartus
    У вас всего один VC, логику мы должны писать только в контроллерах. Этот VC должен знать об этом tableView. Потому и делегатные методы tableView должны быть в этом контроллере, те что отвечают за создание ячейки, выбор ячейки и прочее, а значит и создаваться cardView будет в классе VC, но тогда вопросов об обработке тапов не возникает. Так что вы зря логику вынесли во View классы.

    Если хотим разделить логику, то нужен еще один VC2, который будет держать tableView, будет создавать карты, узнавать об их нажатии. При этом создавать его будет основной VC1 и сразу добавлять вью VC2 на свой. Вот тогда VC2 будет делегировать нажатия по картам в VC1.
    Примеров создания кастомных делегатов очень много, конкретный не посоветую, но они легко гуглятся.
    Ответ написан
  • Как вписать предложение в прямоугольник заданного размера?

    kaspartus
    @kaspartus
    В iOS7 при помощи Text Kit это можно сделать.

    Краткая история: Есть книжка iOS 7 by tutorials - там делают приложение-книжку, много текста, есть картинки, текст форматирован. Возникают логичные вопросы: "Как разбивать его на страницы? Как узнать сколько текста уместилось на странице?" - ответ прост, у NSLayoutManager есть метод glyphRangeForTextContainer: он возвращает кол-во символов в контейнере.

    Потому можем сделать так:
    1. Создаем NSTextStorage, скармливаем ему NSAttributedString.
    2. Создаем NSLayoutManager, отдаем его textStorage'y при помощи addLayoutManager
    3. Создаем NSTextContainer, отдаем его layoutManager'у
    4. Вот тут уже можем при помощи glyphRangeForTextContainer: узнать поместился текст или нет. Меняем шрифт, считаем еще раз. Можно например начать с 10 и расти вверх, как вылезли - взяли предыдущий размер.
    5. Создаем UITextView при помощи initWithFrame:textContainer:
    6. Успех

    Метод костыльный + overkill, работает только на iOS7+. Возможно при помощи textKit можно сделать все изящней, а возможно можно все аккуратно обойти.
    Ответ написан
  • Как реализовать callback для обновления UI из http-запроса (NSURLSession)?

    kaspartus
    @kaspartus
    Блок completion нигде не выполняется и никуда не идет, он начинает выполняться, когда запрос выполнился так или иначе. А main thread никого ждать не должен. Просто в нужное время сессия вызовет completion-блок, действительно, не в главном потоке.

    Немного советов и схема. Возможно предложу не идеальный вариант.
    1. Выпиливаем все до создания сессии в отдельный метод, оно и логично - мы все подготавливаем к дальнейшей работе.
    2. Пишем отдельно метод, который создает таск, при помощи которого будем логиниться(то что в вашем методе после создания сессии). Создаем сам таск при помощи метода dataTaskWithRequest:completionHandler:, completion-блок вызовется когда таск выполнится тем или иным образом. Если успех - к п.3
    3. Вызываем отдельный метод внутри этого блока, где будем писать дальнейшую логику после логина, туда можно накидать создание других тасков. Метод лучше вызвать в главном потоке, т.к. наверняка захочется что-то сделать с UI.
    [self performSelectorOnMainThread:@selector(afterLoginLogicMethod) withObject:nil waitUntilDone:NO];


    P.S. По поводу callback'a от тасков
    Можно его получать через completion-блоки, а можно через делегатные методы, кому как удобнее.
    Ответ написан
    7 комментариев
  • Разчет высоты UITableViewCell по высоте текста?

    kaspartus
    @kaspartus
    Выглядит вполне толково, по идее должно работать, я бы тут предложил 2 варианта:
    1. Дебажим. Ставим брейкпоинты, логируем и прочее.
    2. В книжке видел пример для динамического расчета высоты ячейки.

    - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
      static UILabel* label; 
      if (!label) {
        label = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, FLT_MAX, FLT_MAX)];
        label.text = @"test";
      }
      label.font = [UIFont preferredFontForTextStyle:UIFontTextStyleHeadline];
      [label sizeToFit];
      return ceilf(label.frame.size.height * 1.7); 
    }


    Сам пробовал - работает. Думаю, переделать увеличение высоты с x1.7 на +2margin проблем не составит.
    Ответ написан
    Комментировать
  • Как организовать доступ к IP камере через iPhone?

    kaspartus
    @kaspartus
    А описания api нет? Если нет, то смотри какие запросы идут, или в браузере, или гони трафик через прокси и так восстановишь api.

    Потом просто пишешь свое приложение, повторяя эти запросы.
    Ответ написан
    Комментировать
  • Заполнить view кнопками?

    kaspartus
    @kaspartus
    Немного не так как хочешь, но можно так:
    1. Распиливаем вьюшку на горизонтальные полосы высотой 2 высоты кнопки + 10 точек(можно поиграться). По высоте между полосами сделать пропуск в 5 точек.
    2. Каждую полосу вертикально разбиваем на ячейки(шириной в кнопку), горизонтальное расстояние между ними выбираем случайно между 5-10, в итоге ячейка имеет ширину кнопки и ее двойную высоту.
    3. Кнопку помещаем в ячейку, положение по вертикали выбираем случайно. Итого расстояние как по вертикали так и по горизонтали будет на больше 10, а по горизонтали гарантировано больше 5
    4. Повторяем для остальных полос(лучше добавить рандомное начальное горизонтальное смещение для кнопок). В итоге между "соответствующими" кнопками в соседних полосах будет в самом худшем случае 2 высоты кнопки + 25 точек.

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