Tuesday, February 19, 2013

Помогите по простому определить какой именно объект вызывает событие в UITableView

http://hghltd.yandex.net/yandbtm?text=uitableview%20didselectrow%20%D0%BA%D0%B0%D0%BA%20%D0%BF%D0%B5%D1%80%D0%B5%D0%B4%D0%B0%D1%82%D1%8C%20section%20%D0%B8%20row%20%D0%B2%20%D1%81%D0%B5%D0%BB%D0%B5%D0%BA%D1%82%D0%BE%D1%80&url=http%3A%2F%2Fwww.iPhones.ru%2Fforum%2Findex.php%2Ftopic%2F44926-pomogite-po-prostomu-opredelit-kakoi-imenno-o%2F&fmode=inject&mime=html&l10n=ru&sign=82fed0cc234b84d60962f67ae9e4aa12&keyno=0

Помогите по простому определить какой именно объект вызывает событие в UITableView

Только разбираюсь в obj-c   и  соответственно вопрос будет тупой.
Образно говоря хочу сделать редактор таблички чтобы было 5 колонок  и  много строк. Делаю через tableview. Добавляю в cell текстовые поля.

- (UITableViewCell *)tableView:( UITableView  *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
       
       
NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %d", indexPath. row ];
       
       
MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
       
       
if (cell == nil) {
                cell
= [[[MyTableCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
               
.....
               
for (int i=0; i < 5;i++) {
                       
UITextField *lbl =  [[[UITextField      alloc] initWithFrame:CGRectMake(50+i*colWidth+1, 3, colWidth-1, 20)] autorelease];
                       
.....
                       
[lbl addTarget:self action:@selector(editStarted:) forControlEvents:UIControlEventEditingDidBegin];
                       
[lbl addTarget:self action:@selector(editFinished:) forControlEvents:UIControlEventEditingDidEnd];
                       
[cell.contentView addSubview:lbl];
                       
[lbl release];
               
}
       
}
       
return cell;
}

- (IBAction)editFinished:(id)sender {
}

Вот как бы мне  передать  в editFinished значение  переменной  i  и  indexPath. row  чтобы я мог сохранить полученное значение в массив. В editFinished передается (id) сам объект uitextfield. Может как-то в нем сохранить его координаты. 

#2silver1543

    Участник

  • Пользователь
  • 26 сообщений
    • 0
  • Город:Москва
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 3GS
  • Прошивка:312

Отправлено 16 июля 2009 - 21:30

Ну, можно использовать свойство tag uitextfield'a(вообще uiview) в котором  и  хранить подобную информацию.
Tag Property 

#3kiroleg

    Гуру

  • Разработчик
  • 817 сообщений
    • 7
  • Город:Москва
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 3G
  • Прошивка:421

Отправлено 16 июля 2009 - 21:32

Чтобы сохранить координаты в UITextView, можно использовать его свойство NSInteger tag:
- (UITableViewCell *)tableView:( UITableView  *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
       
       
NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %d", indexPath. row ];
       
       
MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
       
       
if (cell == nil) {
                cell
= [[[MyTableCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
               
.....
               
for (int i=0; i < 5;i++) {
                       
UITextField *lbl =  [[[UITextField      alloc] initWithFrame:CGRectMake(50+i*colWidth+1, 3, colWidth-1, 20)] autorelease];
                       
.....
                       
[lbl addTarget:self action:@selector(editStarted:) forControlEvents:UIControlEventEditingDidBegin];
                       
[lbl addTarget:self action:@selector(editFinished:) forControlEvents:UIControlEventEditingDidEnd];
                       
[cell.contentView addSubview:lbl];

                   lbl
.tag=99+i*100; //Добавляем маркер 99, чтобы опознать в массиве подвидов. Запоминаем номер столбца в регистре сотен.

                   
[lbl release]; //!!! так делать нельзя, поскольку lbl уже авторелизится при инициализации. Нужно выбрать что-нибудь одно. Лучше убрать авторелиз.
               
}
       
}
       
for (UIView *aView in cell.contentView.subviews){
                 
if (aView.tag%100==99) aView.tag=aView.tag%1000+indexPath. row *1000+indexPath. section *10000000; //Обрезаем существующий маркер до значения столбца  и  формируем новый
       
}
       
return cell;
}

Теперь, получив id textField по окончании редактирования, можем запросить свойство tag, доступное для математического разбора на координаты.
Формат такой: CCCBBBBA99, где A-номер столбца, B-номер строки, C-номер секции. Соотвественно, появляются ограничения по количеству строк (не более 10000)  и  секций (не более 213). 

#4silver1543

    Участник

  • Пользователь
  • 26 сообщений
    • 0
  • Город:Москва
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 3GS
  • Прошивка:312

Отправлено 16 июля 2009 - 21:46

Ну да. А можно наверное так:
  - (UITableViewCell *)tableView:( UITableView  *)table cellForRowAtIndexPath:(NSIndexPath *)indexPath {
       
       
NSString *MyIdentifier = [NSString stringWithFormat:@"MyIdentifier %d", indexPath. row ];
       
       
MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
       
       
if (cell == nil) {
                cell
= [[[MyTableCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
               
.....
               
for (int i=0; i < 5;i++) {
                       
UITextField *lbl =  [[[UITextField      alloc] initWithFrame:CGRectMake(50+i*colWidth+1, 3, colWidth-1, 20)] autorelease];
                       
.....
                       
[lbl addTarget:self action:@selector(editStarted:) forControlEvents:UIControlEventEditingDidBegin];
                       
[lbl addTarget:self action:@selector(editFinished:) forControlEvents:UIControlEventEditingDidEnd];
                       
[cell.contentView addSubview:lbl];

                   lbl
.tag=i;
               
}
       
}

        cell
.contentView.tag=indexPath.row+indexPath. section *10000;
       
return cell;
}

#5


Отправлено 16 июля 2009 - 23:14

Спасибо большое, работает. 

No comments:

Post a Comment