Ответы пользователя по тегу iOS
  • Размер ContentSize в UIScrollView iOS. Как выровнять по размеру контента?

    @agee
    UITableView - наследник UIScrollView. Уберите скролл и оставьте лишь таблицу. В первую ячейку таблицы засовывайте Вашу кнопку, с остальными ячейками поступайте как поступали раньше. Для этого, правда, нужно будет использовать отдельный reuseIdentifier для ячейки с кнопкой.
    Либо засуньте кнопку в headerView таблицы. В общем, в Вашем случае так или иначе UIScrollView не нужен. Изучите более внимательно работу с UITableView: секции, хэдеры/футеры таблицы, хэдеры/футеры секций, разные ячейки и их прототипы. Уверен, многое станет на свои места.
    Ответ написан
    1 комментарий
  • Какой язык стоит изучать для разработки приложений под iphone/android?

    @agee
    А Вы с какой целью интересуетесь? Если для развлечения - то без разницы. Если хотите работать - выберите одну платформу и учите один язык. Если iOS - то все-таки Objective-C, Swift не спрашивают пока что.
    А вот когда уже научитесь чему-то одному, то можно и за остальное браться.
    Ответ написан
    1 комментарий
  • Куда поместить код загрузки и парсинга JSON в iOS приложении?

    @agee
    Когда Вы возвращаетесь в главный поток после того, как пришел ответ от сервера, сохраните результаты в Ваш plist и после этого пошлите notification об этом событии. NSNotificationCenter и NSNotification в помощь.
    На эту нотификацию могут быть подписаны любые объекты. Так что если сейчас активен viewController, который отображает погоду в конкретном городе, после получения нотификации смело обновляйте данные.

    Что касается "куда положить код работы с сервисом погоды". Учитывая, что Ваше приложение по описанию миниатюрное, можете смело этот код "пихать" в viewDidLoad root viewController'а. В противном случае, если хочется обращатья к серверу из разных мест, можно создать отдельный синглтон с простеньким интерфейсом в один метод а-ля
    - (void)temperatureListWithCompletion:(void(^)(NSError * error, NSArray *results));
    И вызывать его уже откуда душа пожелает. Не стоит, правда, забывать о том, что нет смысла посылать новый запрос, пока не пришел ответ на предыдущий точно такой же.
    Ответ написан
    1 комментарий
  • Swift. Mapping из JSON в объекты модели. Как парсить массив из массивов?

    @agee
    Для начала неплохо было бы указать, что Вы используете RestKit.
    Создавать переменную path в модели не нужно. Нужно просто дать понять RestKit'у, что ему придется работать с массивом по определенному пути. В качестве пути к маппингу нужно указать не "path", а "data.path".
    Я не работал с классом RKObjectMapping напрямую. Использовал RKObjectManager.
    objectManager = [[RKObjectManager alloc] initWithHTTPClient:afHttpClient];

    Создавал объект типа RKResponseDescriptor, в котором указывал "путь" к JSON-массиву.
    RKResponseDescriptor *characterResponseDescriptor =
        [RKResponseDescriptor responseDescriptorWithMapping:objectMapping
                                                     method:RKRequestMethodGET
                                                pathPattern:pathPattern
                                                    keyPath:@"data.results" // <- путь к JSON-массиву
                                                statusCodes:[NSIndexSet indexSetWithIndex:200]];
        
        [objectManager addResponseDescriptor:characterResponseDescriptor];


    А потом вызывал у обжект-менеджера getObjectsAtPath:
    [objectManager getObjectsAtPath:path
                                               parameters:queryParams
                                                  success:success
                                                  failure:failure];
    Ответ написан
    Комментировать
  • Что плохого в Interface Builder?

    @agee
    Использовать или не использовать IB - это вопрос вкуса. Кому-то кажется, что он упрощает разработку. Кому-то кажется, что усложняет.

    Лично мне всегда было удобней все создавать в коде: когда через некоторое время возвращаешься к проекту, то взглянув на код, можно сразу понять что, где, как и почему. Этот метод более гибок, и я ощущаю полный контроль над UI, могу делать его каким угодно.
    Еще меня немного смущает ситуация, когда что-то работает, но я не знаю, почему оно работает. Не хочется слепо верить галочкам, выставленным в констукторе.

    С другой стороны, если нужно очень быстро набросать базовый UI, и привязать какие-то действия к нему, то IB весьма полезен.
    Ответ написан
    Комментировать
  • Как получить доступ к переменной из другого класса?

    @agee
    В коде viewcontroller'а напишите
    - (void)viewDidLoad {
        [super viewDidLoad];    
        ImageTouched *instance = [[ImageTouched alloc] initWithFrame:CGRectMake(0, 0, 50, 50)];
        [self.view addSubview:instance];
        // Подписываемся на уведомление
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(imageDidTouch:) name:@"ImageTouchedImageDidTouch" object:nil];
    }


    Добавьте к коду вью-контроллера метод
    // Метод, который обрабатывает уведомление
    - (void)imageDidTouch:(NSNotification *)notification {
        if ([notification.object isKindOfClass:[ImageTouched Class]])
            NSLog(@"Pew value is %@", ((ImageTouched *)notification.object).pew);
    }


    А уже в touchesBegan вызовите это уведомление
    -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
        NSLog(@"Image Touched");
        self.pew = @"pewpewpewew";  
        // Отправить уведомление, отправляя самого себя в качестве параметра object
        [[NSNotificationCenter defaultCenter] postNotificationName:@"ImageTouchedImageDidTouch" object:self];
    }


    Для чтения:
    О свойствах https://developer.apple.com/library/ios/documentat...
    Об уведомлениях: https://developer.apple.com/library/mac/documentat...
    Ответ написан
  • UICollectionView with custom UICollectionViewCell?

    @agee
    Не трогайте высоту в cellForItemAtIndexPath вообще. Только после загрузки данных в UIWebView меняйте высоту этого webView. Когда это произойдет, просто вызовите - (void)reloadItemsAtIndexPaths:(NSArray *)indexPaths для того indexPath, которому соответствует этот webView. Это обновит содержимое нужной ячейки и запросит ее размеры у делегата.

    Если используете UICollectionViewDelegateFlowLayout нужнуые размеры передайте в - (CGSize)collectionView:(UICollectionView *)aCollectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath. Этот метод вызовется сам после вызова reloadItemsAtIndexPaths
    Ответ написан
  • Как определить нажатие по image в UIWebView in iOS?

    @agee
    Вы можете выполнить в контексте страницы UIWebView свой JS-код https://developer.apple.com/library/ios/documentat...
    В этом JS-коде, например, на все кратинки навесить обработчики на событие onclick и передавать в этот обработчик сам элемент или например ссылку на само изображение. В обработчике события можно делать редирект на какую-нибудь урлу типа mypotocol://myurl.
    А вот уже в методе делегата webView:shouldStartLoadWithRequest:navigationType: определять протокол и урл, и если совпадает с mypotocol и/или myurl, то выполнять нужные действия, при этом возвращать NO.
    Ответ написан
    Комментировать
  • (iOS) Как сравнить введенное в UITextField число со значением в Label?

    @agee
    Вы сравниваете указатель chislo с некой переменной number. Вам нужно обратиться к содержимому UITextField посредством обращения к свойству text - это вернет вам значение типа NSString. Затем нужно получить число из текстовой переменной - вызвать integerValue или floatValue. И только потом сравнивать с другим значением. Например:
    NSInteger chisloValue = [chislo.text integerValue];
    if (number == chisloValue)
    ...
    Ответ написан
    1 комментарий
  • Проблема с переопределением touchesEnded для подкласса UICollectionViewCell?

    @agee Автор вопроса
    Проблема решена.
    Я переписал touchesEnded следующим образом:
    - (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
        [super touchesEnded:touches withEvent:event];
        if (_editingMode) {
            // Do my thing
        }
    }

    А игнорирование дефолтного поведения в режиме editingMode я уже реализовал в didSelectItemAtIndexPath:
    GDCollectionViewCell *cell = [collectionView cellForItemAtIndexPath:indexPath];
        if (cell.editingMode)
            return; // Do nothing in editing mode

    Пожалуй, так нужно было сделать с самого начала.
    Ответ написан
    Комментировать