• Стоит ли учить Swift Obj-c developer'y?

    martsen
    @martsen
    Программист-дроновод
    100500-й вопрос...
    Учить надо будет точно. Тут вопрос в актуальности.
    На мой взгяд, если Ваш продукт будет выходить в ближайший год, то пишите на Obj-C.
    Если Вы планируете запуск через года два, то пишите сразу на Swift.

    Сейчас Swift еще обкатывают и пишут к нему обвязку. Для Obj-C уже есть готовая инфраструктура.
    Ответ написан
    Комментировать
  • Obj-C Как правильно работать с потоками?

    morozovdenis
    @morozovdenis
    в этом конкретном случае вам надо просто дизаблить кнопку

    - (IBAction)login:(UIButton *)sender {
            sender.enabled = NO;
    	AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
    	NSDictionary *parameters = @{@"_login": @"bar", @"_pass" : @"123"};
    	[manager POST:@"http://example.com/resources.json" parameters:parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
    	    NSLog(@"JSON: %@", responseObject);
                sender.enabled = YES;
    	} failure:^(AFHTTPRequestOperation *operation, NSError *error) {
    	    NSLog(@"Error: %@", error);
                sender.enabled = YES;
    	}];
    }


    в общем случае задача которую вы описываете на мой взгляд специфична для каждого проекта.

    если хотите запросы одного типа выполять последовательно, можете использовать например NSOperationQueue

    если хотите что-бы в один момент выполнялся только один запрос конкретного типа, то в любом случае заводить BOOL-флаг, можете написать обёртку над вашем методом выше которая сама будет рулить такие ситуации
    Ответ написан
    2 комментария
  • Как проиндексировать таблицу из массива объектов?

    morozovdenis
    @morozovdenis
    ...
        Customers *customers;
        NSMutableDictionary *dictionaryCustomers;
        NSArray *sortedKeys = nil;
    ...
            for (NSDictionary *dictionary in [responseData objectForKey:@"data_list"]) {
                customers = [[Customers alloc] init];
                
                for (NSString *key in [dictionary allKeys]) {
                    if ([customers respondsToSelector:NSSelectorFromString(key)]) {
                        [customers setValue:[dictionary objectForKey:key] forKey:key];
                    }
                }
                //например по имени индексируем
                NSString *fisrtSymbol = [[customers.name substringFromIndex:1] uppercaseString];
                if ([dictionaryCustomers.allKeys containsObject:fisrtSymbol] == NO)
                {
                       dictionaryCustomers[fisrtSymbol] = [NSMutableArray new];
                }
                [dictionaryCustomers[fisrtSymbol]  addObject:customers];
            }
            sortedKeys = [dictionaryCustomers.allKeys sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
                return [obj1 compare:obj2];
            }]


    после этого
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
    return dictionaryCustomers.count;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
    return [dictionaryCustomers[sortedKeys[section]] count];
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    Customers *c = [dictionaryCustomers[sortedKeys[indexPath.section]] obkectAtIndex:indexPath.row];
    
    ...
    
    return cell;
    }
    
    - (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView
    {
    return sortedKeys;
    }


    UPD:
    фильтр:
    @interface MyViewController ()
    @property NSMutableDictionary *dictionaryCustomers; // исходные которые были заполненны из responseData
    @property NSArray *sortedKeys; // исходные которые были заполненны из responseData
    
    @property NSDictionary *currentDictionaryCustomers; 
    @property NSArray *currentSortedKeys;
    
    @end
    
    @implemented MyViewController
    
    - (void)parseResponse:(id)responseData
    {
              // парсим ответ
              self.dictionaryCustomers = ...
              self.sortedKeys = ...
    
              self.currentDictionaryCustomers = self.dictionaryCustomers;
              self.currentSortedKeys = self.sortedKeys;
    }
    
    - (void)filterCustomers:(NSString *)sFilter
    {
              NSMutableDictionary *result = [NSMutableDictionary new];
                
                for (NSString *key in [self.dictionaryCustomers allKeys])
                {
                    for (Customers *customer in self.dictionaryCustomers[key])
                    {
                            if (<customer.company содержит sFilter>)
                            {
                                      if ([result.allKeys containsObject:key] == NO) result[key] = [NSmutableArray new];
                                      
                                      [result[key] addObject:customer];
                            }
                    }
                }
            self.currentDictionaryCustomers = result;
            self.currentSortedKeys = [result.allKeys sortedArrayUsingComparator:^NSComparisonResult(NSString *obj1, NSString *obj2) {
                return [obj1 compare:obj2];
            }]
    
            [self.tableView reloadData];
    }
    
    // тут заполняем tableView из self.currentDictionaryCustomers и self.currentSortedKeys
    
    @end
    Ответ написан
  • Есть ли среда разработки для iOS/Android на Windows 7?

    VYakushev
    @VYakushev
    Разработчик Android в Nowtaxi
    Вариантов для Android на самом деле несколько:
    1. Eclipse. Изначально SDK делался под него. Но этот комбайн немного тормознуто работает на более менее большом проекте. Качаете просто Eclipse Standart. Все остальные варианты содержат ненужные вам плагины.
    2. Netbeans. Тоже неплохая среда разработки. Мало чем уступает Eclipse.
    3. Android Studio. На самом деле за названием скрывается IntelliJ IDEA, которую считаю самой лучшей средой разработки на Java. Это подтверждает и то, что Google отказался от Eclipse в пользу этой среды разработки. Выбирайте её и не пожалеете.

    Стоит отметить ещё один факт. Для первых двух надо обязательно отдельно скачать Android SDK и потом в настройках указать его расположение. Android Studio уже содержит SDK и сама всё настроит. Но для разработки все равно надо будет потом запустить менеджер SDK и установить нужные вам версии Android, которые вы планируете для разработки.

    А вот для iOS всё сложнее. Во-первых нет никакой возможности разрабатывать на Windows или Linux. Только Mac OS и ничего другого. В качестве IDE для разработки родной и бесплатный Xcode от Apple. Также можно приобрести платный AppCode всё от той же JetBrains, которая является разработчиком IntelliJ IDEA и многих других популярных IDE.
    Ответ написан
    Комментировать
  • UITableView - как прикрутить комментарии к записям?

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

    если нужно что-бы ячейки раскрывались/закрывались и/или отображались только например 3 последних комментария, то по нажатию на кнопку "раскрыть комментарии" вызывать метод reloadData и пусть перестроит видимую часть таблицы

    UPD:
    Вам нужно в сториборде создать две разных ячейки и присвоить им в настройках два разных ReuseIdentifier-а(например UserCell для ячейки юзера и CommentCell для ячейки комментария). Потом прописать делегаты для кол-ва секций и кол-ва ячеек в каждой секции:
    #pragma mark - UITableViewDataSource
    - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
    {
        return self.users.count;
    }
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
    {
        return self.users[section].comments.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
    	if (indexPath.row == 0)
    	{
    		UITableViewCell *cell = [[self tableViewAllCheckins] dequeueReusableCellWithIdentifier:@"UserCell"];
    		
    		NSDictionary *userInfo = self.users[indexPath.section];
    		
    		// заполнение ячейки User-а
    		
    		return cell;
    	}
    	else
    	{
    		CommentViewCell *commentCell = [[self tableViewAllCheckins] dequeueReusableCellWithIdentifier:@"CommentCell"];
    		
    		UserInfo *userInfo = self.users[indexPath.section];
    		
    		CommentInfo *comment = userInfo.comments[indexPath.row - 1]; // так как нулевая ячейка в секции принадлежит пользователю, а первая ячейка принадлежит нулевому комментарию, то надо сделать минус 1
    		
    		// заполнение ячейки Comment-а
    		
    		return commentCell;
    	}
    }
    Ответ написан
    8 комментариев
  • Как перевезти Аймак 21 в самолете?

    metamorph
    @metamorph
    MBP retina 15" - Ваш выбор.
    Ответ написан
    Комментировать
  • GitHub.com - как стянуть Releases/Tags без потери истории коммитов?

    jcmvbkbc
    @jcmvbkbc
    "I'm here to consult you" © Dogbert
    Releases/Tags -- это просто теги. Если хочется вытянуть теги (и историю ведущую к ним) из удалённого репозитория в локальный, это можно сделать так:

    git remote add remote_tags <url>
    git fetch --tags remote_tags
    git remote del remote_tags


    Локальные коммиты, конечно, останутся, но теги могут с ними не совпадать, если, например, историю переписывали, или это два совсем разных репозитория.
    Ответ написан
  • Как переделать игру из JavaScript в Objective C?

    icelaba
    @icelaba
    Знаю и умею всё
    Если под ios в браузере идет то можно не переделывать phonegap.com
    Ответ написан
    4 комментария
  • IOS - как осуществить игровую анимацию на заднем фоне?

    morozovdenis
    @morozovdenis
    навскинду два варианта сразу приходят на ум:

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

    2. собрать это в видос и запустить его на заднем плане

    я сделал бы первый вариант, он гибче. в первом варианте ничего не надо дополнительно собирать если кол-во кадров и/или сами кадры изменятся

    //как-то так должен выглядеть MyImagesView.m файл
    
    @interface MyImagesView ()
    
    @property (nonatomic, strong) UIImageView *imageView;
    
    @property (nonatomic, assign) int currentImage;
    @property (nonatomic, assign) int totalImages;
    
    @end
    
    @implementation
    
    /*
     * этот метод надо вызывать в таймере. обязательно в Main Thread
     */
    - (void)showNextImage
    {
    	assert([NSThread isMainThread] == YES);
    	
    	self.currentImage ++;
    	if (self.currentImage == self.totalImages)
    	{
    		// что бы отображать картинки циклически
    		self.currentImage = 0;
    	}
    	
    	UIImageView *newImageView = [[UIImageView alloc] initWithFrame:self.bounds];
    	newImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"image_name%i.png", self.currentImage]];
    	
    	[self.imageView removeFromSuperview]; // убираем прирыдущий кадр из view-хи (затираем сильную ссылку номер 1)
    	self.imageView = nil; // убираем сильную ссылку номер два (тут UIImageView должна выгрузиться из памяти, а с ней и UIImage)
    	
    	[self addSubview:newImageView]; // закидываем новый кадр во view-ху (создаём сильную ссылку номер 1)
    	self.imageView = newImageView; // сохраняем ссылку на новый кадр что бы иметь в следующем вызове метода showNextImage ссылку на предыдущий кадр  (создаём сильную ссылку номер 2)
    }
    
    @end


    UPD:
    попробуйте заменить:
    newImageView.image = [UIImage imageNamed:[NSString stringWithFormat:@"image_name%i.png", self.currentImage]];
    на:
    NSString *imageName = [NSString stringWithFormat:@"image_name%i", self.currentImage];
    newImageView.image = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:imageName ofType:@"png"]];
    Ответ написан
  • IOS - как осуществить игровую анимацию на заднем фоне?

    @kocherovets
    Поищите какую-нибудь реализацию покадровой анимации на UIKit, если вас именно рисованная анимация интересует.
    Ответ написан
    1 комментарий
  • Как легко добавить поддержку iOS 7?

    nochkin
    @nochkin
    Смотря как написано приложение. Не исключено, что его будет достаточно просто скомпилировать в новом Xcode установив iOS7 как Base SDK (обычно там просто "Latest iOS", в этом случае даже не надо ничего менять).
    Если будут ошибки или какие-то GUI "странности", то тогда уже надо конкретно работать в этом направлении.
    И, конечно, тестировать-тестировать-тестировать.

    Например, я в своём приложении только верхний status bar подправил немного.
    Ответ написан
    Комментировать
  • Как сделать игру максимально оптимизированной?

    @SamUzer Автор вопроса
    Наверно, не правильно задал вопрос, как сделать игру, которая бы пошла на данные устройства(ведь там мобильных девайсах всего 512 мб опертивы). Возможно, урезать графику или ещё что-нибудь?
    Ответ написан
    1 комментарий