не может поместить методы в tableView: cellForRowAtIndexPath: - PullRequest
0 голосов
/ 05 апреля 2011

У меня есть NSMutableString с именем алфавиты в моем классе.Я помещаю [буквенные символы CharacterAtIndex: 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;
}

Ответы [ 3 ]

1 голос
/ 05 апреля 2011

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

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

РЕДАКТИРОВАТЬ:

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

[alphabets retain];

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

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

0 голосов
/ 06 апреля 2011

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

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

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

0 голосов
/ 05 апреля 2011

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

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