Страницы

Поиск по вопросам

Показаны сообщения с ярлыком uitableview. Показать все сообщения
Показаны сообщения с ярлыком uitableview. Показать все сообщения

вторник, 17 марта 2020 г.

Вопрос про UITableView и UITableViewCell в iOS

#ios #uitableview


Доброе время суток коллеги!
Столкнулся с такой задачей. Необходимо выводить информацию в UITableView в два кастомных
UITableViewCell. верхний как бы заголовок, нижний текст с произвольной высотой. Если
кликать на заголовок необходимо попадать на профиль пользователя, если кликать на текст
попадать на полный текст статьи. Пример реализации которая мне нужна хорошо выполнен
в приложении ВКонтакте для iphone, в разделе группы. У меня не получается вывести данные
в два UITableViewCell по очереди. 
https://www.dropbox.com/s/g1g6btk4zudrhr1/screen.pdf
В приложенном файле я нарисовал прототип того как должен выглядеть табличный вид
на мобильном телефоне. 
Если кто сталкивался или знает как это можно реализовать прощу помочь.    


Ответы

Ответ 1



После обсуждения этого вопроса с его автором в скайпе мы совместно выяснили, что оба вида ячеек на самом деле относятся к одной сущности (пользователю и контенту, связанному с ним) и решили, что нужно, чтобы был создан только один тип ячейки, в которую контент нынешних двух типов ячейки войдет в виде двух subviews - один subview для заголовка ячейки (информация о пользователе), другой - для контента (сообщение пользователя). Главная же проблема скрывалась в том, что из-за наличия двух видов ячеек, автор, полагаясь на строку вида EXHeaderTableCell *headerCell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier forIndexPath:indexPath]; получал неправильное обращение к индексу в массиве Reusable cells, так как indexPath в большинстве случаев указывал на ячейку противоположного типа.

Ответ 2



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *CellPersonIdentifier = @"CellPersonIdentifier"; static NSString *CellDataIdentifier = @"CellDataIdentifier"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:(indexPath.row % 2 == 0 ? CellPersonIdentifier : CellDataIdentifier)]; if (cell == nil) { NSArray *nib = [[NSBundle mainBundle] loadNibNamed:(indexPath.row % 2 == 0 ? @"CellPerson" : @"CellData") owner:self options:nil]; cell = [nib objectAtIndex:0]; } // далее заполняешь ячейки данными }

вторник, 25 февраля 2020 г.

NSTimer приостанавливает выполнение при скролле uitableView

#objective_c #uitableview


Есть UIVew c кнопкой старт,  UILabel  в который записывается текущее время и uitableView,
в котором время сохраняется (как простой стандартный таймер)
Проблема в том, что при скролле таблицы - таймер замерзает, как сделать чтобы они
работали синхронно ?
имею такой таймер 
- (IBAction)startTimer {
    _startButton.hidden = YES;
    _stopButton.hidden = NO;

    isRun = YES;

    UIBackgroundTaskIdentifier bgTask = UIBackgroundTaskInvalid;
    UIApplication *app = [UIApplication sharedApplication];
    bgTask = [app beginBackgroundTaskWithExpirationHandler:^{
        [app endBackgroundTask:bgTask];
    }];

    myTimer = [NSTimer scheduledTimerWithTimeInterval:0.01f
                                               target:self
                                             selector:@selector(tick)
                                             userInfo:nil
                                              repeats:YES];

}

и функию 
- (void)tick {

    _timeSot++;

    sot++;

    if (_timeSot > 99) {
        _timeSot = 0;
        _sec++;
    }
    if (_sec > 59) {
        _sec = 0;
        _min++;
    }
    //_min = _sec / 60;

    NSString *sotStr;
    if (_timeSot < 10) {
        sotStr = [NSString stringWithFormat:@"0%d", _timeSot];
    } else {
        sotStr = [NSString stringWithFormat:@"%d", _timeSot];
    }

    NSString *secStr;
    if (_sec < 10) {
        secStr = [NSString stringWithFormat:@"0%d", _sec];
    } else {
        secStr = [NSString stringWithFormat:@"%d", _sec];
    }

    NSString *minStr;
    if (_min < 10) {
        minStr = [NSString stringWithFormat:@"0%d", _min];
    } else {
        minStr = [NSString stringWithFormat:@"%d", _min];
    }

    myTime = [NSString stringWithFormat:@"%@:%@:%@", minStr, secStr, sotStr];

    if (sot >= ([[[_exerises objectAtIndex:_indexExercise] objectForKey:@"timeWorkOutExerciseClient"]
intValue] * 100)) {
        [self stopTimer];
        [self sendNotification];
    }

    [_timeLabel setText:myTime];
}
    


Ответы

Ответ 1



Проблема решена: [[NSRunLoop mainRunLoop] addTimer:myTimer forMode:NSRunLoopCommonModes];

четверг, 13 февраля 2020 г.

Не могу разобраться со storyboards в Xcode 5

#ios7 #xcode #xib #uitableview


Всем привет, не могу разобраться со сторибордами. Гуглю уже третий день, делал по
мануалам – ничего не получается. Почти все мануалы по xcode 4.x, а я работаю в пятом.
Я как понял, есть какая-то разница в реализации между xcode 4 и 5. Не запускаются даже
самые простые схемы, не могу понять вообще принцип сторибордов (в целом понятно, но
как нужно что-то реализовать – ступор), поэтому и не понимаю, почему ничего не работает.
Помогите, пожалуйста, разобраться, понять разницу между xib и storyboard. В чем лучше
работать и при каких раскладах? Все книги по IOS 6, которые у меня есть – все с примерами
xib, которые я даже не могу запустить в 5-ом xcode. У apple адекватной документации
не нашел, все запутанно. По xcode 5 + IOS 7 книги, как я понимаю, еще не скоро выйдут,
пару месяцев наверное ждать. Нужно реализовать примерно такую схему, ячейки в таблицах
– статические. 

Схема:


    


Ответы

Ответ 1



По порядку: сториборды везде функционально одинаковые разница между 4 и 5 версией Xcode есть, в целом улучшена функциональность и внешний дизайн. В остальном почти все в наличии в одинаковом комплекте xib'ы удобнее, сториборды проще, уже обсуждали. Навигация и функционал таблиц например реализовывается чуть по разному. Для сторибордов можно скачать и посмотреть раздел семь, там уже Вам будет более понятно как это работает. С xib'ами в сети так же много примеров. Чуть больше кода, но более понятна логика реализации. Также можно писать все вообще без визуальных представлений, все кодом (иногда без этого никак) у Apple в документации ничего не запутано, бейте в гугле все вопросы, ответы найдете гарантированно. Там и описания и разъяснения с картинками, примеры кода и готовые проекты с тестовыми реализациями в Xcode 5 .xib'ы припрятали как опцию по умолчанию при создании проекта, тем не менее их тоже можно использовать. Гуглите add UIViewController

Ответ 2



Рекомендую изучить работу с xib. Довольно хорошо описано с примерами в книге: "Программирование под iOS. Для профессионалов". Почему xib, а не storyboard, опять же выдержка из этой книги:

пятница, 12 июля 2019 г.

Objective-C: поиск по изображениям в таблице

Я хочу выполнить поиск изображений с помощью search bar в tableview. Мой поиск работает, но для показа изображения я использую этот код в
- (void)viewDidLoad { [super viewDidLoad];
_array18 = [[NSArray alloc ]initWithObjects:@"title1",@"title2",@"title3", nil]; _image = [[NSArray alloc ]initWithObjects:[UIImage imageNamed:@"title1.jpg"],[UIImage imageNamed:@"title2.jpg"],[UIImage imageNamed:@"title3.jpg"], nil];
}
- (void)searchForText:(NSString*)searchText scope:(NSString*)scope {
NSPredicate *resultPredicate = [NSPredicate predicateWithFormat:@"SELF contains[cd] %@", searchText];
_searchResults = [_array18 filteredArrayUsingPredicate:resultPredicate]; }
Но код в cellForRowAtIndexPath не является простым решением, если у меня есть 100 изображений или больше мне нужно создавать 100 проверок. Как можно упростить этот код или есть ли более простое решение?
(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell";
cell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if (cell == nil) { cell= [[cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; }
if ([[_searchResults objectAtIndex:indexPath.row]isEqualToString:@"title1"]) { cell.imageView.image = [_image objectAtIndex:0]; } if ([[_searchResults objectAtIndex:indexPath.row]isEqualToString:@"title2"]) { cell.imageView.image = [_image objectAtIndex:1]; } if ([[_searchResults objectAtIndex:indexPath.row]isEqualToString:@"title3"]) { cell.imageView.image = [_image objectAtIndex:2]; } }


Ответ

Используйте словарь:
@property (strong,nonatomic)NSMutableDictionary *dic;
- (void)viewDidLoad { [super viewDidLoad]; _array18 = [[NSArray alloc]initWithObjects:@"title1",@"title2",@"title3", nil]; [self initDic]; }
- (void)initDic { self.dic = [[NSMutableDictionary alloc] initWithDictionary:@{ @"title1":[UIImage imageNamed:@"title1.jpg"], @"title2":[UIImage imageNamed:@"title2.jpg"], @"title3":[UIImage imageNamed:@"title3.jpg"] }]; }
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"Cell"; cell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier]; if (cell == nil) { cell = [[cell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; } cell.imageView.image = [dic objectForKey:[_searchResults objectAtIndex:indexPath.row]];
return cell; }

четверг, 6 июня 2019 г.

Вопрос про UITableView и UITableViewCell в iOS

Доброе время суток коллеги! Столкнулся с такой задачей. Необходимо выводить информацию в UITableView в два кастомных UITableViewCell. верхний как бы заголовок, нижний текст с произвольной высотой. Если кликать на заголовок необходимо попадать на профиль пользователя, если кликать на текст попадать на полный текст статьи. Пример реализации которая мне нужна хорошо выполнен в приложении ВКонтакте для iphone, в разделе группы. У меня не получается вывести данные в два UITableViewCell по очереди. https://www.dropbox.com/s/g1g6btk4zudrhr1/screen.pdf В приложенном файле я нарисовал прототип того как должен выглядеть табличный вид на мобильном телефоне. Если кто сталкивался или знает как это можно реализовать прощу помочь.


Ответ

После обсуждения этого вопроса с его автором в скайпе мы совместно выяснили, что оба вида ячеек на самом деле относятся к одной сущности (пользователю и контенту, связанному с ним) и решили, что нужно, чтобы был создан только один тип ячейки, в которую контент нынешних двух типов ячейки войдет в виде двух subviews - один subview для заголовка ячейки (информация о пользователе), другой - для контента (сообщение пользователя). Главная же проблема скрывалась в том, что из-за наличия двух видов ячеек, автор, полагаясь на строку вида EXHeaderTableCell *headerCell = [tableView dequeueReusableCellWithIdentifier:HeaderCellIdentifier forIndexPath:indexPath]; получал неправильное обращение к индексу в массиве Reusable cells, так как indexPath в большинстве случаев указывал на ячейку противоположного типа.