Задать вопрос
Ответы пользователя по тегу Objective-C
  • Как добавить изображение по ссылке в ячейку UITableView?

    Flanker_4
    @Flanker_4
    Не делайте так, как советует Максим Пригоженков
    метод dataWithContentsOfURL не предназначен для этого. А в документации Apple (видать достали) прям подчеркивает, что метод не для сетевых запросов.
    Просто используйте готовое решение SDWebImage.
    P.S. Если вопрос был "понять как это сделать самому" , то просто поищите в интернете UIImage async load
    Вот первое что увидел

    Что касается imageView
    stackoverflow.com/questions/27142581/outlets-canno...
    У вас там видать нет сабкласса UITableViewCell, но при этом в xib'e /storyboard'e вы накидали вьюшки, о которых стандартный UITableViewCell ничего не знает
    Ответ написан
    4 комментария
  • Как установить шрифт для 6 айфона?

    Flanker_4
    @Flanker_4
    Нет, увы, так не получится (надеюсь в июне apple покажут новые size classes)
    Но это можно сделать в коде, использую appearence или subclass для uilabel
    Ответ написан
    7 комментариев
  • Как использовать UICollectionView с другими элементами?

    Flanker_4
    @Flanker_4
    Вам нужно использовать ваш банер в качестве SupplementaryElement
    За это отвечает метод dataSource
    - (UICollectionReusableView *)collectionView:(UICollectionView *)collectionView viewForSupplementaryElementOfKind:(NSString *)kind atIndexPath:(NSIndexPath *)indexPath

    Это будет самым правильным решением
    Если нужна какая-то сложная анимация - то тут уже понадобится работа с uiscrollview, но о этом речь даже не идет
    Ответ написан
    1 комментарий
  • Как использовать распознавание речи от Apple?

    Flanker_4
    @Flanker_4
    Вы пытаетесь делать все как-то неправильно. Это приложение все равно не пропустят в стор, зачем тогда себя ограничивать public Api. Поищите в private api возможность взаимодействовать с Siri (я уверен , они есть)
    Вот , к примеру, активация сири

    - (BOOL)activateVirtualAssistant{   
       if ([%c(SBAssistantController) preferenceEnabled]) { 
          if ([%c(SBAssistantController) shouldEnterAssistant]) {
              SBAssistantController *assistant = (SBAssistantController *)[%c(SBAssistantController) sharedInstance];           
              if (assistant.assistantVisible)   
                 [assistant dismissAssistant];          
              else {
                 [(SpringBoard *)UIApp activateAssistantWithOptions:nil withCompletion:nil];
                 return YES;
              }     
           }
       }    
       return NO;
    }

    взято тут
    Ответ написан
    Комментировать
  • Как получить индекс нажатой accessory button?

    Flanker_4
    @Flanker_4
    Я не совсем понимаю, что Вы делаете. В идеале, прикреплять к вопросу проект-пример с демонстрацией проблемы

    Но Вам должно помочь следующее - в методе
    - (void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath{}

    "Сохранить" indexPath и вручную вызвать
    [self performSegueWithIdentifier:@"SEGUE_ID" sender:self]; //*

    *Это только если делегат UITableView является UIViewController, а у Вас наверняка так)
    Ну и конечно же, нужно убрать предыдущий performSegue, явный , или тот что вы цепляли в InterfaceBuilder'e
    Ответ написан
    1 комментарий
  • Почему падает скорость загрузки файлов (objective-c)?

    Flanker_4
    @Flanker_4
    Я бы тому человеку, который в примерах для демонстрации загрузки файлов использовал изначально метод dataWithContentsOfURL: руки то обломал. И тянется все это уже не первый год. Что не пример, как грузить файлы из сети, так dataWithContentsOfURL. Не для этого этот метод создан. В комментариях прям написано.

    Do not use this synchronous method to request network-based URLs. For network-based URLs, this method can block the current thread for tens of seconds on a slow network, resulting in a poor user experience, and in iOS, may cause your app to be terminated.

    Instead, for non-file URLs, consider using the dataTaskWithURL:completionHandler: method of the NSSession class. See URL Loading System Programming Guide for details.


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

    Flanker_4
    @Flanker_4
    К сожалению нет. Но возможно есть кастомные реализации подобного sheduler'а

    В iOS очень сложно с работой в фоне+приложение может быть выгружено в любой момент пользователем. Самый идеальный вариант - реализовать подобную логику на сервере, и , воспользовавшийсь какой либо очередью сообщений (rabbit mq там) +remote push notification, уведомить клиента о наступлении события

    Но если с сервером проблемы, то вручную это делается следующим образом:
    1) Определить дату и время срабатывания
    2) Завести таймер NSTimer с этой датой, там есть метод initWithFireDate(точно не помню), указав селектор(метод) для срабатывания
    3) при уходе приложения в фон остановить таймер
    4) при возвращении приложения из фона или при запуске - проверить , больше ли текущее время за запланированное в пункте 1 . Если да, то выполнить предпологаемую логику, если нет - то выполнить пункт 2.

    Для того, что бы пользователь не проморгал момент наступления события, можно бросать/шедулить локальные нотификации UILocalNotification- в этом случае, если приложение будет в фоне, пользователь увидет пуш и если это что то важное для него - запустит приложение и кинет вас в пункт 4
    Ответ написан
    1 комментарий
  • Чем отличаются URL для директории Documents iOS-приложения?

    Flanker_4
    @Flanker_4
    Вот тут обсуждают это вопрос

    Because of this, it seemed obvious that /private/var is a symlink to /var. However, @Kevin-Ballard points out that is not true. I confirmed that he is correct, and /var is the symlink to /private/var (sigh)


    Но, это Вас должно вообще не парить. Дело в том, что Apple все время что-то меняет и в своем приложении лучше хранить относительные пути к файлам.
    Изменения в iOS 8 отличное тому подтверждение.
    Ответ написан
    Комментировать
  • Как привязать UIViewController к IBOutlet'у родительского контроллера?

    Flanker_4
    @Flanker_4
    Я такое не реализовывал , но в интернете подсказывают что это можно попробовать реализовать через кастомные segue

    https://orderoo.wordpress.com/2012/02/23/container...
    sandmoose.com/post/35714028270/storyboards-with-cu...
    Ответ написан
  • Селекторы в Objective-c?

    Flanker_4
    @Flanker_4
    Селектор - это "название" метода. А по факту просто строка.
    Классический пример: есть класс NSString и NSNumber. У каждого из них есть методы intValue (методы разные, как понимаете), но при этом, объекты как первого класса , так и второго будут реагировать на один и тот же селектор @selector(intValue)
    для полноты картины, лучше посмотреть на apple доки
    https://developer.apple.com/library/mac/documentat...
    https://developer.apple.com/library/mac/documentat...
    Ответ написан
    1 комментарий
  • Как в ObjectiveC сделать классы уникальными для каждой static библиотеки?

    Flanker_4
    @Flanker_4
    Не уверен что это сработает, нужно пробовать
    1) Получить Class из нужной либы
    что-то типа этого (код писал прямо тут, ориентируясь на )
    static inline Class getClassFromLib1(){
         int numberOfClasses = objc_getClassList(NULL, 0);
        Class *classes = calloc(sizeof(Class), numberOfClasses);
        Class retClass = Nil;
        numberOfClasses = objc_getClassList(classes, numberOfClasses);
        for (int i = 0; i < numberOfClasses; ++i) {
            Class c = classes[i];
            if (([NSBundle bundleForClass:c] ==/*нужная либа*/)&&(/*проверка на нужный класс*/)) {
                   retClass = c;
                   break;
            }
        }
        free(classes);
        return retClass;
    }

    2) на основе полученного классов создать объект.
    Class a = getClassFromLib1();
       id objectClass1 = [[a alloc] init];


    Аналогично для второй либы.

    Только добавьте "кеширование" получения класса
    Ответ написан
  • Почему происходит сброс данных в массиве?

    Flanker_4
    @Flanker_4
    Вам нужно заменить
    Card *tmp = obj;
    На
    Card *tmp = [obj copy]
    или
    Card *tmp = [Card new];

    В зависимости от специфики того, что вы делаете
    Мне не видно всех свойств Card
    Ответ написан
    Комментировать
  • Как реализовать переход на другой View Controller через SWTableViewCell?

    Flanker_4
    @Flanker_4
    Небольшая прелюдия:
    Если Вы только обучаетесь, и Вам не важна поддержка iOS 7 - лучше посмотреть в сторону стандартного api
    см. метод tableView:editActionsForRowAtIndexPath
    Пример как использовать тут, ближе к концу

    А переход на другой "экран" делается в самом простом случае
    -(void)buttonizeButtonTap:(id)sender{
        [self performSegueWithIdentifier:@"Associate" sender:sender];
    }

    где Associate - id перехода в storyboard'e (там прям и задается строка)
    Пример взят от сюда, там же можно посмотреть скриншотики со стрелочками , правда для старого XCode, но там особо ничего не поменялось.
    Ответ написан
    8 комментариев
  • Как сделать переход UITableView Header в элемент управления?

    Flanker_4
    @Flanker_4
    Самым простым и быстрым решением будет
    self.tableView.contentInset = UIEdgeInsetsMake(0, 0, <table height>-<row height>*<row count>, 0);

    Т.е. мы ограничиваем скрол у таблицы на высоту секции (rowHeigh*rowCount) но с возможностью проскролить вверх на весь экран (table height)
    Обратите внимание, что в "формуле" не учтены футер и хидер таблицы, да и вообще оно будет криво работать с таблицами где ячейки разноразмерные, где таблица не plain, а group. Да да, а еще если это UITableViewController и в нем включен UINavigationBar, то вам размер tableview вернет все 568 пикселей для 4" экрана, вместе с navigation bar'om, и нужно будет это предусмотреть. Короче куча исключений...
    Ответ написан
    5 комментариев
  • Кто-нибудь сталкивался с проблемой?

    Flanker_4
    @Flanker_4
    У Вас там что-то несусветное написано...
    Но проблема конкретно в

    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return self.lesson.cards.count;
    }

    Тут нужно написать self.cards.count

    После вызова
    [self.tableView insertRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:[self.cards count]-1 inSection:0]] withRowAnimation:UITableViewRowAnimationFade];
    Количество ячеек должно совпадать с тем, что возвращается в методе datasouce. Иначе произойдет падение. А у вас же вставка идет в cards(их станет ну там 3), а в дата соурсе возвращается количество из self.lesson.cards (которых так и останется 2)
    Но при этом в саму таблицу ячейку уже впихнули через insertRow - 2!=3 - вот и падает
    Ответ написан
  • В чем отличия void от Id в objective-c?

    Flanker_4
    @Flanker_4
    Вы наверное имели ввиду void* ?
    Отличие в том, что id указатель на objective - c объекты, а void* указатель на неопределенный тип, или просто область в памяти (в которой может хранится все что угодно).

    stackoverflow.com/questions/1304176/objective-c-di...
    Ответ написан
    Комментировать
  • Как передать NSMutableArray с объектами одного класса в метод?

    Flanker_4
    @Flanker_4
    В идеале отказаться от оперирования NSMutableView, а класс, который его содержит - сделать контейнером, добавив методы
    -addObject
    -removeObject
    -(NSArray*) objects
    И либо на этапе добавления контроллировать уникальность, либо на этапе извлечения (-objects). Через ту же Фильтрацию массивов. Ну либо перед передачей массива параметром провести ту же фильтрацию. К сожалению, а может и к счастью - массивы в foundation могут содержать любые обьекты

    Кстати, то что Вы хотите сделать - отлично делается на swift . Код objective c и swift миксуется без проблем. Да и вообще, с c# на свифт проще будет переехать
    Ответ написан
    1 комментарий
  • Как организовать Core data без tableview?

    Flanker_4
    @Flanker_4
    Понимаете в чем дело, CoreData Framework предназначен для хранения и управления графом объектов. Именно по этому везде используют UITableView. Он без заморочек позволяет отобразить иерархическую структуру, был бы стандартный контролл для рисования графов, юзали бы его. Ну так вот, Core Data не предназначен для хранения переменных - это как на самолете по сельской дороге кататься. Настоятельно рекомендую почитать хотя бы первые две главы https://developer.apple.com/library/mac/documentat... Для сохранения каких-то переменных лучше всего использовать NSUserDefault или же NSKeyedArchiver

    На всякий случай, если Вы все же захотите что-то записать в CoreData , то смотрите на главы Creating and Deleting Managed Objects и Fetching Managed Objects. Ну и перед тем как писать "переменную", ее нужно будет представить в виде объекта...
    Ответ написан
    Комментировать
  • Как получить обрантую от картинки в objective c?

    Flanker_4
    @Flanker_4
    Получить изображение по маске можно с помощью CoreGraphics
    Пример можно посмотреть тут. Если Вам не нужно изображение, а нужно всего лишь этот трюк провернуть в ui, то посмотрите на QuartzCore (гуглить по тегам mask CALayer)
    Теперь что касается маски... Я не совсем понял насколько она у Вас может быть вариантивноq, но если это квадрат, то его можно просто отрисовать через coreGraphics (создаете контекст и через CGContextAddRect рисуете нужную Вам маску)
    Или же, если она у Вас нарисована в calayer, отрендерить в ту же картинку как приведено тут

    Еще есть вариант с CoreImage и фильтром CIBlendWithAlphaMask , ну тут опять же, Вам нужно будет создать маску
    CoreImage теоретичеки будет работать быстрее... .
    Я к сожалению плохо знаком со сторонними библиотеками по компьютерной графике, но рекомендую Вам покопаться в чем-то аля OpenCV
    Ответ написан