установка значения UITableViewCell из экземпляра пользовательского объекта - PullRequest
0 голосов
/ 10 апреля 2011

Таким образом, в основном я пытаюсь создавать экземпляры класса ниже каждый раз, когда я получаю действительный ответ от веб-запроса, а затем сохраняю эти экземпляры в массиве, чтобы я мог получить доступ к их данным позже.Затем я пытаюсь заполнить табличное представление конкретными полями из экземпляров, которые хранятся в массиве.У меня были некоторые проблемы, так как я очень хорошо знаком с C ++ и делаю такие вещи с векторами, а затем просто получаю доступ, основываясь на нужном мне индексе, но это заставило меня вырваться из головы!Спасибо, код ниже:

eventDetails.h:

@interface eventDetails : NSObject {
NSString *eventName, *eventID;
}

-(void) setEventID : (NSString *) ID;
-(void) setEventName: (NSString *) name;
-(NSString *) getEventName;
-(NSString *) getEventID;

, а также обратите внимание, что

 NSMutableArray *events

объявлено в моем файле .h и

 events = [[NSMutableArray alloc] init]; 

был вызван в viewDidLoad

Затем я динамически создаю экземпляры при получении ответа от веб-запроса и добавляю их в массив:

if ([elementName isEqualToString:@"id"])
{
    NSLog(@"at beginning of event, length is %i", [events count]);
    temp = [[eventDetails alloc] init];
    [temp setEventID:[NSMutableString stringWithString:soapResults]];

    [soapResults setString:@""];
    elementFound = FALSE; 
}

if ([elementName isEqualToString:@"name"])
{

    [temp setEventName:[NSMutableString stringWithString:soapResults]];
    [events addObject:temp];
    [soapResults setString:@""];
    elementFound = FALSE; 
    //[temp release];

}

После того, как все будетПосле всего, что я сделал, я создал небольшую тестовую функцию, чтобы убедиться, что данные были установлены правильно:

-(void) test{
for (eventDetails *s in events){
    NSLog(@"Entry ID: %@ with name %@", [s getEventID], [s getEventName]);
 }
}

, и я получаю следующий (правильный) вывод:

2011-04-09 18: 53: 24.624 Validator [90982: 207] Идентификатор записи: 701 с именем iPhone Test Event 2011-04-09 18: 53: 24.625 Validator [90982: 207] Идентификатор записи: 784 с именем Another iPhone Test Event 2011-04-09 18: 53: 24.626 Валидатор [90982: 207] Идентификатор записи: 839 с именем третье iphone

Затем я пытаюсь обновить представление таблицы и получить от него данные из экземпляров вмассив:

 // Customize the appearance of table view cells.
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";
//---try to get a reusable cell---
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
//---create new cell if no reusable cell is available---
if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                                  reuseIdentifier:CellIdentifier] autorelease];
}
//---set the text to display for the cell---
eventDetails *cellDetails = [[eventDetails alloc] init];
NSInteger row = [indexPath row];
cellDetails = [[self events] objectAtIndex:row];

NSString *cellValue = [cellDetails getEventName];
NSLog(@"Event is: %@", cellValue);
cell.textLabel.text = cellValue;
cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
return cell;

}

Но каждый раз, когда программа попадает в эту часть, она вылетает, что EXC_BAD_ACCESS, где я говорю:

 cell.textLabel.text = cellValue;

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

1 Ответ

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

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

Проверьте вашу setEventName: реализацию;ему нужно будет отправить либо retain, либо copy в аргумент name, чтобы убедиться, что строка не будет освобождена до того, как вы ее закончили.Однако ситуация сложнее, чем если вы хотите избежать утечек памяти, поэтому, если вы еще этого не сделали, я бы порекомендовал прочитать об управлении памятью, в частности превосходное руководство по программированию управления памятью от Apple ..(Примечание: я прекратил публиковать ссылки, так как Apple продолжает их изменять).

Примечание: не добавляйте префиксы имен методов доступа к слову get;это было бы хорошо в Java или C ++, но это Objective-C.Ваши средства доступа должны выглядеть следующим образом:

- (NSString *)eventName;
- (NSString *)eventID;

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

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