не удается разместить методы в TableView: cellForRowAtIndexPath:

#iphone #objective-c #cocoa-touch #uitableview

#iPhone #objective-c #cocoa-touch #uitableview

Вопрос:

В моем классе есть NSMutableString с именем alphabets. Я помещаю [алфавитный символиндекс: i] или [длина алфавитов] в TableView: cellForRowAtIndexPath:. Но когда я использую reloaddata, приложение вылетает.

Редактировать: должен ли я выполнять все вычисления с алфавитами за пределами TableView, а затем передавать массив значений в TableView.

здесь появляется «алфавиты»

в @interface

 NSMutableString *alphabets;
  

@реализация

 - (IBAction) textFieldDoneEditing: (id)sender {

    Logic *myLogic = [[Logic alloc] init];
    alphabets = [NSMutableString stringWithCapacity:0];

    alphabets = [myLogic formatSentence: sentenceTextField.text];
    alphabets = [myLogic makeAscending: alphabets];

    [logicTable reloadData];

    // removes keyboard
    [sentenceTextField resignFirstResponder];
}

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

    static NSString *CellIdentifier = @"Cell";

    MyTableCell *cell = (MyTableCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[MyTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    }

    // this causes all the problem  
    cell.textLabel.text = alphabets;

    return cell;
}
  

Комментарии:

1. Определите «сбой приложения». Пожалуйста, опубликуйте содержимое консоли с объяснением сбоя.

2. Вам нужно будет опубликовать несколько примеров кода.

Ответ №1:

Просто предположение, не видя никакого кода, но является ли «алфавитный» мусор уже собранным к моменту вызова cellForRowAtIndexPath …? Или у вас уже есть возможность сохранить его?

Покажите нам несколько фрагментов кода. Тот, который создает / создает экземпляры «алфавитов», и тот, где он используется…

Редактировать:

Основываясь на фрагментах кода, которые вы добавили в свой вопрос, мне кажется, что вам, вероятно, нужно:

 [alphabets retain];
  

после вашего последнего назначения «alphabets» — я не могу сказать наверняка, не видя реализацию «[myLogic makeAscending: alphabets]» — если он вызывает метод, который возвращает временную строку, вам нужно сохранить ее, чтобы сохранить в переменной-члене (ivar).

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

Комментарии:

1. Нет сборки мусора на iPhone

2. Действительно? Каков ваш источник информации о сборке мусора на iPhone …?

3. developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/…

4. Хм. Интересно. Думаю, мне следовало сказать «уже выпущено / удалено» вместо «собранный мусор» — на мой взгляд, концептуально они довольно близки друг к другу. Спасибо, что поправили меня.

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

Ответ №2:

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

Ответ №3:

Я бы сделал что-то вроде

 if (alphabets) {
    cell.textLabel.text = alphabets;
}
  

потому что из вашего примера кода кажется, что вы можете назначать textLabel.text из неинициализированного указателя, пока кто-то не отредактирует TextField.