Как мне ссылаться на UITextField, динамически добавляемый в UITableView? - PullRequest
0 голосов
/ 13 октября 2011

У меня проблемы со ссылкой на UITextField. Прямо сейчас я использую UIAlertView для проверки ссылки. В этом приложении у меня есть несколько представлений, которые должны быть очень похожими, и я создал HelperClass (я не должен создавать подкласс UIViewController?). Контроллеры представления, которые я имею, передают сообщения делегатов вместе с TableItemsHelperClass. В этом TableItemsHelperClass я динамически добавляю ячейки в таблицу. Сейчас я сталкиваюсь с проблемой, связанной с этими ячейками, моя конечная цель - обработать освобождение первого респондента (клавиатуры), но я был бы рад захватить содержимое Textfields для проверки ссылки.


обновление Я переориентировался с использования HelperClass на подклассы UIViewController. Некоторые имена переменных были изменены. Оба эти метода находятся в родительском классе. Теперь у меня есть случай, когда tableView:didSelectRowAtIndexPath: звонит tableView:cellForRowAtIndexPath:, то is nil регистрируется. Почему я не вернул камеру?

//tableView cellForRowAtIndexPath
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

        NSString *CellIdentifier = [NSString stringWithFormat:@"Cell %d", indexPath.row];

        UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

        if (cell != nil) {
            NSLog(@"is not nil");
            return cell;
        }

        NSLog(@"is nil");
        CGRect CellFrame        = CGRectMake(0,  0, 300, 65);
        CGRect LabelViewFrame   = CGRectMake(5,  5, 290, 25);
        CGRect TextViewFrame    = CGRectMake(5, 35, 290, 25);

        cell = [[[UITableViewCell alloc] initWithFrame:CellFrame 
                                                               reuseIdentifier:CellIdentifier] autorelease];

        textFieldView = [[UITextField alloc] initWithFrame:TextViewFrame];
        labelView = [[UILabel alloc] initWithFrame:LabelViewFrame];
        textFieldView.backgroundColor = [UIColor greenColor];
        labelView.backgroundColor   = [UIColor redColor];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;

        if (@"int" == [self.taxPayerTypes objectAtIndex:indexPath.row]) {
            textFieldView.keyboardType = UIKeyboardTypeDecimalPad;
        }

        if (0 == indexPath.section) {
           [labelView setText:[self.taxPayerList objectAtIndex:indexPath.row]];
        } else {
           [labelView setText:[self.spouseList  objectAtIndex:indexPath.row]];
        }

        [cell.contentView addSubview:textFieldView];
        [cell.contentView addSubview:labelView];

    return cell;
}

//tableView didSelectRowAtIndexPath
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    for(UIView *i in [[[self tableView:tableView cellForRowAtIndexPath:indexPath] contentView] subviews]) {
        if ([i isKindOfClass:[UITextField class]]) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSStringFromClass([i class]) 
                                                            message:[i text]//[(UITextField*)i text]
                                                           delegate:self 
                                                  cancelButtonTitle:@"a" 
                                                  otherButtonTitles:@"b", nil];
            [alert show];
            [alert release];
        }
    }
}

Оригинал

//in the UIViewController/////////////////////////////////////////////////////////////////////////////////

-(UITableViewCell*)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    return [TableItemsHelper tableView:tableView cellForRowAtIndexPath:indexPath];
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    for(UIView *i in [[[TableItemsHelper tableView:tableView cellForRowAtIndexPath:indexPath] contentView] subviews]) {
        if ([i isKindOfClass:[UITextField class]]) {
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSStringFromClass([i class]) 
                                                            message:[i text]
                                                           delegate:self 
                                                  cancelButtonTitle:@"button 1" 
                                                  otherButtonTitles: @"button", nil];

            [alert show];
            [alert release];

        }
    }
}
////////////////////////////////////////////////////////////////////////////////////////////////////////


//In the TableItemsHelperClass//////////////////////////////////////////////////////////////////////////

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";
    CGRect CellFrame    = CGRectMake(0,  0, 300, 65);
    CGRect TextViewFrame    = CGRectMake(5, 35, 290, 25);

    // …

    UITableViewCell *cell = [[[UITableViewCell alloc] initWithFrame:CellFrame 
                                                    reuseIdentifier:CellIdentifier] autorelease];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero 
                                       reuseIdentifier:CellIdentifier] autorelease];
    }


    UITextFieldView = [[UITextField alloc]  initWithFrame:TextViewFrame];
    [cell.contentView addSubview:UITextFieldView];
    return cell;
}

////////////////////////////////////////////////////////////////////////////////////////////////////////

Ответы [ 2 ]

1 голос
/ 13 октября 2011

Я не уверен, почему у вас сложилось впечатление, что вы не должны создавать подкласс UIViewController.(Практически все ваши контроллеры представления подкласс UIViewController, и если у вас есть несколько идентичных контроллеров представления, вы можете извлечь выгоду, подклассифицируя их от другого, который вы создаете.) Но это не похоже на ваш вопрос.

То, что вы, похоже, делаете, легче сделать, если вы создадите подкласс UITableViewCell для создания собственной ячейки.Тогда ваш UITextFieldView может быть свойством подклассовой ячейки, что делает его доступным напрямую, вместо использования вашего цикла тестирования для поиска подпредставления с этим типом класса.

(Между прочим, ваше именование переменных, кажется, противоречит общим соглашениям, потенциально затрудняя чтение кода. Возможно, вы захотите использовать имя переменной, например «textFieldView», а не «UITextFieldView».Первый выглядит как обычное имя переменной, а второй выглядит как обычное имя класса.)

Ваш «вспомогательный класс» может быть заменен подклассом для UITableViewCell.Есть несколько примеров создания подклассов UITableViewCell в сети.Если вам нужны ссылки, дайте мне знать, и я опубликую некоторые ссылки (как только я окажусь перед компьютером, с которым я смогу работать:)

Надеюсь, это поможет, и вы не противдругие редакционные комментарии, которые я сделал.

0 голосов
/ 13 октября 2011

В cellForRowAtIndexPath

// use local variable, not instance variable
UITextField *textField = [[UITextField alloc]  initWithFrame:TextViewFrame];
// tag it for later access
textField.tag = 1;
[cell.contentView addSubview:textField];
[textField release];

В didSelectRowAtIndexPath

// NOT [TableItemsHelper tableView:cellForRowAtIndexPath:]
// that would give you a new cell
UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
UITextField *textField = [cell viewWithTag:1];
// do what you want with textField

"Я не должен создавать подкласс UIViewController?"

Нет, это не так.На самом деле, похоже, ваш код является подклассом UIViewController.Но, возможно, вы имеете в виду, что думаете, что не должны создавать подкласс своего подкласса UIViewController, например:

@interface MyViewController : UIViewController
@interface MyViewControllerFirstVariant : MyViewController
@interface MyViewControllerSecondVariant : MyViewController

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...