Tuesday, February 19, 2013

UITableview и ячейки в которых содержутся кнопки, текстовые поля и т.д.

http://hghltd.yandex.net/yandbtm?text=uitableview%20%D0%BE%D0%B1%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%BA%D0%B0%20%D0%BD%D0%B0%D0%B6%D0%B0%D1%82%D0%B8%D1%8F%20%D0%BD%D0%B0%20%D1%8F%D1%87%D0%B5%D0%B9%D0%BA%D1%83&url=http%3A%2F%2Fwww.iPhones.ru%2Fforum%2Findex.php%2Ftopic%2F79994-uitableview-i-jacheiki-v-kotorih-soderzhutsja-knopki-tekstov%2F&fmode=inject&mime=html&l10n=ru&sign=8ea56350c67eae34a0e12136de2718a9&keyno=0

UITableview  и  ячейки  в которых содержутся кнопки, текстовые поля и т.д.

Отправлено 22 июня 2011 - 13:19

У меня возник вопрос.

Вот у меня есть  UITableview .

Я создал 5  ячеек .

Дальше я хочу сделать так, чтобы в первой ячейке была кнопка, во второй, допустим, textfield для ввода текста, в третей label....

Как сделать lable я понимаю. Тут ниче сложного, я пишу

cell.textLabel.text = @"blablabla";

а как мне сделать, чтоб в ячейке было поле для ввода текста? Кнопка, которая будет выполнять некоторые действия? 

#2t.r.o.n.

    Абсолют

  • Разработчик
  • 2 332 сообщений
    • 112
  • Город:Луганск / Москва
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 4
  • Прошивка:6.0.0

Отправлено 22 июня 2011 - 13:46

  -(UITableViewCell *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
       
//Создание  ячеек 

UITableViewCell *cell = [tableView ..... любой вариант получения......];
if(cell == nil)
{
         cell
= [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIndentifier] autorelease];  
         
UIView *a = cell.contentView;
         
         
// И В ЭТОЙ ВЬЮШКЕ ДЕЛАЕМ ЧТО ХОТИМ

}
}

Сообщение отредактировал t.r.o.n.: 22 июня 2011 - 13:50


#3_Bitter_

    Участник

  • Разработчик
  • 100 сообщений
    • 0
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 3GS
  • Прошивка:ne

Отправлено 22 июня 2011 - 13:56

Для этого вам нужно создаться класс, наследник от UITableViewCell. Он в свою очередь наследуется от UIView, так что вы можете создавать  на   ячейке  все что угодно, а затем в методе делегата таблицы tableView:cellForRowAtIndexPath: имея номер секции и номер строки, вы должны вернуть указатель на вашу  ячейку . Например так:
- (UITableViewCell *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

       
static NSString *CellIdentifier = @"postItemCell"; // Возможно идентификатор нужно тоже в зависимости от класса  ячейки  указывать разный, попробуй
       
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
       
int row = [indexPath row];

       
if (cell == nil) {
           
switch (row) {
               
case 0: cell = [[[CellWithButton alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier frame:cellFrame] autorelease]; break;
               
case 1: cell = [[[CellWithText alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier frame:cellFrame] autorelease]; break;
               
case 2: cell = [[[CellWithLabel alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier frame:cellFrame] autorelease]; break;
           
}
       
}
       
return cell;
}

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

P.S. Вариант, который написал t.r.o.n. кажется лучше 

Сообщение отредактировал _Bitter_: 22 июня 2011 - 13:59

#4LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

Отправлено 22 июня 2011 - 19:46

Просмотр сообщенияt.r.o.n. (22 июня 2011 - 13:46) писал:

  -(UITableViewCell *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
       
//Создание  ячеек 

UITableViewCell *cell = [tableView ..... любой вариант получения......];
if(cell == nil)
{
         cell
= [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIndentifier] autorelease];  
         
UIView *a = cell.contentView;
         
         
// И В ЭТОЙ ВЬЮШКЕ ДЕЛАЕМ ЧТО ХОТИМ

}
}
не совсем понял. это для каждого нужного мне объекта нужно создавать View? или одно создать и внем создавать кнопки, текствые поля....

И еще. я знаю как без IB создавать нужные объекты, но как их связать с созданным View? 

#5t.r.o.n.

    Абсолют

  • Разработчик
  • 2 332 сообщений
    • 112
  • Город:Луганск / Москва
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 4
  • Прошивка:6.0.0

Отправлено 22 июня 2011 - 19:52

UIView не создается а получается. Его создает таблица  для каждой ячейки и дает на него ссылку.
А вот в него уже можно добавлять все что угодно.
добавлять как обычно [a addSubView:*****] 

Сообщение отредактировал t.r.o.n.: 22 июня 2011 - 19:54


#6LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

Отправлено 23 июня 2011 - 12:04

Ну с этим я разобрался. Получается создать, все что нужно, но вот вопрос возник.

Когда я создаю нужный объкт по вышеописанной схеме, то у меня во всех строчках получается  один и тот же объект...

я знаю как загрузить из plist разное содержимое, в разные ячейки. а тут как поступить? чтоб лейбл в первой ячейке, кнопка во второй и т.д. 

#7_Bitter_

    Участник

  • Разработчик
  • 100 сообщений
    • 0
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 3GS
  • Прошивка:ne

Отправлено 23 июня 2011 - 12:17

Я ж написал выше: через switch 

#8LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

Отправлено 23 июня 2011 - 12:23

Просмотр сообщения_Bitter_ (23 июня 2011 - 12:17) писал:

Я ж написал выше: через switch
аа точно, не обратил внимание на switch
Спасибо. 

#9LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

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

Теперь получилось
Но появился вопрос.

Не могу кнопку в ячейку впихнуть.

  
UIButton *button = [[UIButton alloc] initWithFrame:CGRectMake (0,90,100,40)];

button
.titleLable.text = @"Lalala";
button
.buttonType = [UIButton buttonWithType:UIButtonTypeRoundRect];                      //object cannot be set

[cellView addSubview:button];

как правильно кнопку создать? 

#10ATiSoft

    Участник

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

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

  UIButton *button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
CGRect buttonRect = CGRectMake(20, 115, 280, 36);
[button setFrame:buttonRect];
[button setTitle:@"button" forState:UIControlStateNormal];
[button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];
[cell addSubview:button];
[button release];

Сообщение отредактировал ATiSoft: 23 июня 2011 - 14:46

#11t.r.o.n.

    Абсолют

  • Разработчик
  • 2 332 сообщений
    • 112
  • Город:Луганск / Москва
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 4
  • Прошивка:6.0.0

Отправлено 23 июня 2011 - 15:46

Можно вопрос?
Зачем кнопку ретейнить чтобы потом реалисить????
Такая наглядность больше нравится? 

#12ATiSoft

    Участник

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

Отправлено 23 июня 2011 - 15:58

На самом деле это просто пример из сохраненных в эверноте.
Кинул проходя мимоходом. :) 

#13LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

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

Возникла еще одна странность.
Воспользовавшись всеми советами, все получилось, но...

Я изначально указал, что у меня три строки.

Создал три объекта, лэйбл, текстфилд и кнопку. но они почему-то располагаются через строку. и соответственно кнопка не влазит. указываю пять, появляется кнопка, но опять же через строку. почему через ячейку, а не подряд?

Upd: Создал две кнопки. они идут одна за другой... странно


И еще, как кнопку, созданную без IB, связать с экшеном? 

Сообщение отредактировал LLIo6oH: 23 июня 2011 - 16:40

#14Villy

    Участник

  • Пользователь
  • 70 сообщений
    • 1
  • Город:Ташкент
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 4
  • Прошивка:4.3.3

Отправлено 23 июня 2011 - 17:11

Ты бы код выложил, так проще было бы понять что там не так.

Цитата

И еще, как кнопку, созданную без IB, связать с экшеном?

Выше же писалось как

Цитата

[button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside];

и сам метод для обработки

- (void) buttonAction:(UIButton*)sender {


#15ATiSoft

    Участник

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

Отправлено 23 июня 2011 - 17:12

Просмотр сообщенияLLIo6oH (23 июня 2011 - 16:12) писал:

И еще, как кнопку, созданную без IB, связать с экшеном?

[button addTarget:self action:@selector(buttonAction:) forControlEvents:UIControlEventTouchUpInside]; 

#16LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

Отправлено 23 июня 2011 - 17:39


Сообщение отредактировал LLIo6oH: 23 июня 2011 - 17:58

#17LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

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

Просмотр сообщенияVilly (23 июня 2011 - 17:11) писал:

Ты бы код выложил, так проще было бы понять что там не так.
  - (UITableViewCell *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
       
       
static NSString *CellIdentifier = @"Cell";
       
       
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
       
if (cell == nil) {
                cell
= [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
               
               
UIView *cellView = cell.contentView;
               
               
//textfield
               
               
UITextField *txtFirst = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 300, 40)];
                txtFirst
.placeholder = @"Enter your text";
                txtFirst
.textColor = [UIColor blackColor];
               
               
//label
               
               
UILabel *lblSecond = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 40)];
                lblSecond
.text = @"Your text";
                lblSecond
.textColor = [UIColor blackColor];
                lblSecond
.backgroundColor = [UIColor blueColor];
               
               
//button
               
               
UIButton *btThird = [UIButton buttonWithType:UIButtonTypeRoundedRect];
               
CGRect buttonRect = CGRectMake(0, 0, 200, 40);
               
[btThird setFrame:buttonRect];
               
[btThird setTitle:@"Start stop scrolling" forState:UIControlStateNormal];
               
[btThird addTarget:self action:@selector(buttonActions:) forControlEvents:UIControlEventTouchUpInside];
               
               
UIButton *btFours = [UIButton buttonWithType:UIButtonTypeRoundedRect];
               
CGRect buttonRectt = CGRectMake(0, 0, 200, 40);
               
[btFours setFrame:buttonRectt];
               
[btFours setTitle:@"Alert message" forState:UIControlStateNormal];
               
[btFours addTarget:self action:@selector(Alert) forControlEvents:UIControlEventTouchUpInside];
               
               
switch (indexPath.row) {
                       
case 0:
                               
[cellView addSubview:txtFirst];
                               
break;
                       
case 1:
                               
[cellView addSubview:lblSecond];
                               
break;
                       
case 3:
                               
[cellView addSubview:btThird];
                               
break;
                       
case 4:
                               
[cellView addSubview:btFours];
               
}
                               
               
[txtFirst release];
               
[lblSecond release];
       
}
       
       
// Configure the cell.

       
return cell;
}

Сообщение отредактировал LLIo6oH: 23 июня 2011 - 21:31

#18Villy

    Участник

  • Пользователь
  • 70 сообщений
    • 1
  • Город:Ташкент
  • ОС:Mac OS X/Windows
  • Мой телефон:iPhone 4
  • Прошивка:4.3.3

Отправлено 24 июня 2011 - 09:49

У тебя в блоке switch, "case" идут не по порядку 0,1,3,4 поэтому и получается что через строку 

#19LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

Отправлено 24 июня 2011 - 12:53

Просмотр сообщенияVilly (24 июня 2011 - 09:49) писал:

У тебя в блоке switch, "case" идут не по порядку 0,1,3,4 поэтому и получается что через строку
а слона-то я и не заметил )))) 

#20LLIo6oH

    Участник

  • Адепт
  • 105 сообщений
    • 0
  • ОС:Mac OS X
  • Мой телефон:iPhone 4S
  • Прошивка:ne

Отправлено 24 июня 2011 - 13:20

Ну и последний вопос.

Как правильно организовать доступ к созданному объекту в строке?

Ну то есть, у меня есть кнопка, по нажатию которой я хочу сделать что-нибудь с лейблом.

Но если я пишу метод взаимодействия до кода, который выше, например

-(IBAction)DoSomething{
   
[txtFirst resignFirstResponder];
}

То понятное дело он пишет, что txtFirth не определен.

Как же прально организовать доступ? 

Сообщение отредактировал LLIo6oH: 24 июня 2011 - 13:21


No comments:

Post a Comment