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

    @agee
    Я Вам сейчас открою страшный секрет. Плохое преподавание - это не оправдание для того, чтобы не учиться. Берите в руки книги и вперед - учиться самостоятельно. Благо, ресурсов сейчас выше крыши. А колледж не бросайте: доучитесь хотя бы до бакалавра, лишние знания и звания никому не мешали еще.

    Еще один большой "секрет": попытайтесь устроиться на работу уже сейчас (хоть на стажировку, хоть на позицию "поди-подай", если уж совсем никакого толку), не ждите окончания учебы. Учиться и работать одновременно - шикарная школа жизни. Зато по окончании учебного заведения будет и опыт, и хоть некоторое понимание того, что Вам нужно.

    23, конечно, не 33, но откладывать в долгий ящик не стоит. Пока Вы сомневаетесь и теряетесь, позиции, на которые Вы претендуете, будут занимать те, кто не сомневается и двигается в выбранном направлении.

    Желаю успехов.
    Ответ написан
    Комментировать
  • Какие исходники софта просить у разработчика?

    @agee
    Безусловно, вам нужны будут:
    - Полные исходники, включая все зависимости, а также файлы проектов. В идеале репозиторий целиком.
    - Исходные макеты для дизайна, а также готовые (напр., нарезанные) картинки во всех необходимых разрешениях, если таковые используются в приложениях.
    - Если они использовали какой-нибудь облачный бэкенд, - все доступы к аккаунтам бэкенда.
    - Если они использовали свой частный бэкенд, - необходим перенос их бэкенда на ваш сервер. После этого удостовериться, что все работает, как прежде (для людей технически неподкованных задача нелегкая, хотя все зависит от реализации).
    - Если они использовали какие-то библиотеки третьих лиц или обращаются в коде к серверам третьих лиц, которые подразумевают использование ключей (напр., авторизация в соц. сетях, рекламных сетях, сервисы Гугла и т.д и т.п.), необходимо забрать все ключи и доступы к админкам этих ресурсов.
    - В случае с Apple App Store, необходимо совершить миграцию приложения на ваш аккаунт (https://developer.apple.com/library/ios/documentat...). Естественно, этот эккаунт нужно заранее создать и разобраться, как что настраивать, какие сертификаты и для чего генерировать. Все последующие апдейты уже надо будет подписывать вашими новыми сертификатами. По Андроиду, думаю, нужно совершить похожие действия.

    P.S.: Важно учесть, что нельзя менять ключи на новые и отключать старые сервера бекэндов до того, как не выпустите апдейт клиентских приложений с новыми ключами и URL-ами, иначе вся сетевая работа приложениях остановится.
    Ответ написан
    Комментировать
  • Кто что думает по поводу j2objc?

    @agee
    Если у вас с архитектурными вопросами все очень хорошо, то можно и попробовать. Разработчики j2objc заявляют, что можно писать бизнес-логику на джаве, потом транслировать это все в objC, что, в принципе, не лишено права на жизнь. Думаю, работу со всеми стандартными контейнерами реально перевести на NSFoundation-рельсы, что они, наверное, с успехом и делают.

    В то же самое время, в j2objc нет и не планируется поддержки работы с UI. И это тоже, как по мне, весьма правильно. Цитата:
    J2ObjC does not provide any sort of platform-independent UI toolkit, nor are there any plans to do so in the future. We believe that iOS UI code needs to be written in Objective-C or Objective-C++ using Apple's iOS SDK (Android UIs using Android's API, web app UIs using GWT, etc.).


    Таким образом, стоит хорошенько подумать, подходит ли Вам это. ИМХО, не лучший выбор в большинстве случаев.
    Ответ написан
    Комментировать
  • Размер ContentSize в UIScrollView iOS. Как выровнять по размеру контента?

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

    @agee
    Есть один отличный способ найти ответ на любой вопрос типа "[Insert word here] ценится у работодателей?" - поставить себя на место работодателя.

    Забудьте на мгновенье о себе реальном и просто представьте, что Вы должны добрать человека в команду. Вам пришло 15 резюме, у кого-то высшее образование, у кого-то его нет, а у кого-то стаж работы в США, допустим. А у кого-то только pet-projects. А кто-то еще на Coursera диплом получал.

    Потом сядьте и пару минут подумайте, что на Вас произведет впечатление, а что не очень. Это и будет ответ на Ваш вопрос.

    P.S.: Вот я провел такой мысленный эксперимент и лично для себя пришел к выводу, что лучше хотя бы прослушанный курс на Coursera, чем вообще ничего. Но это я. Сколько людей, столько мнений.
    Ответ написан
    Комментировать
  • Перспективы iOS-разработчика?

    @agee
    Если Вам скучно в Вашей конкретной конторе, это не значит, что это .NET сам по себе скучный. Вы с таким же успехом можете найти скучную работу в любой технологии. ИМХО, надо расти просто профессионально, тогда авось и интересные проекты нарисуются сами.
    Ответ написан
    1 комментарий
  • Какие есть сайты с вопросами и ответами для собеседований?

    @agee
    glassdoor.com - есть раздел собеседований в реальных компаниях. Выбираешь компанию и смотришь, что там спрашивают. Заполняют сами соискатели.
    Ответ написан
    Комментировать
  • Можно ли выбрать магазины при публикации в App Store?

    @agee
    Одна лицензия на все магазины. Более того, для каждого приложения Вы можете отдельно выбирать, для учеток каких стран оно будет доступно, а для каких - нет.
    Ответ написан
    Комментировать
  • Какой язык стоит изучать для разработки приложений под iphone/android?

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

    @agee
    Доктор, Вы уверены, что обращаетесь к UI из главного, а не из второстепенного потока? Если нет - исправьте, и посмотрите, решило ли Вашу проблему.
    Ответ написан
    2 комментария
  • Куда поместить код загрузки и парсинга 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 весьма полезен.
    Ответ написан
    Комментировать
  • Как вернуть один элемент массива objective-c ?

    @agee
    Когда Вас "отправляет в main()" - это явный признак того, что ошибка есть. И выводится она в XCode внизу в панели вывода логов. Там же будет выведен стек вызовов. Пройдитесь трассировщиком и выясните, на какой строке вылетело исключение.
    Если ошибка в строке token = [data objectAtIndex:1], убедитесь, что:
    - JSONObjectWithData возвращает именно объект массива, а не, допустим, словаря (потенциально выскачит ошибка NSInvalidArgumentException при вызове doesNotRecognizeSelector);
    - в возвращаемом массиве, если это массив, больше 1-го элемента (может выскочит NSRangeException, если Вы берете 2-ой элемент, а там, допустим, он всего один).
    Ответ написан
    1 комментарий
  • Как получить доступ к переменной из другого класса?

    @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

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