#objective-c #ios #xcode #uitableview
#objective-c #iOS #xcode #uitableview
Вопрос:
После правильного заполнения массива, когда я вызываю его снова с помощью tableview reload, в первый раз (после очистки) возвращается пустое значение, а после выполнения возвращается EXC_BAD_ACCES . Пытаюсь предоставить весь необходимый код… Спасибо за помощь!
в файле .h:
@interface userViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> {
NSArray *appData;
IBOutlet UIActivityIndicatorView *activityIndicator;
IBOutlet UILabel *status;
IBOutlet UITableView *mainTable;
IBOutlet UIBarButtonItem *refresh;
}
@property (nonatomic, retain) UIActivityIndicatorView *activityIndicator;
@property (nonatomic, retain) UILabel *status;
@property (nonatomic, retain) UITableView *mainTable;
@property (nonatomic, retain) UIBarButtonItem *refresh;
@property (nonatomic, retain) NSArray *appData;
- (IBAction) refresca: (id)sender;
в файле .m при выполнении функции requestFinished AppData заполняется правильно.
- (void)requestFinished:(ASIHTTPRequest *)request {
NSLog(@"%@", [request responseString]);
[activityIndicator stopAnimating];
activityIndicator.hidden = YES;
appData = [[request responseString] componentsSeparatedByString: @"#"];
int x =0;
while (x<[appData count] - 1)
{
NSLog(@"Data = %@",[appData objectAtIndex: x]);
x = x 1;
}
}
Однако после его выполнения при перезагрузке tableview AppData кажется пустым, а предыдущее содержимое удалено!!
2011-10-13 18:10:43.682 Nimbo[444:207] Data = <UITableViewCellContentView: 0x5c93dd0; frame = (0 0; 320 43); layer = <CALayer: 0x5c953b0>
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
[tableView setFrame:CGRectMake(0, 44, 320, 412)];
static NSString* cellIdentifier = @"cellIdentifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];
if(cell == nil)
{
cell = (UITableViewCell*) [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}
cell.accessoryType = UITableViewCellAccessoryNone;
cell.textLabel.backgroundColor = [UIColor clearColor];
int x = 0;
if ([appData count] != 0)
{
NSLog(@"Data = %@",[appData objectAtIndex: 0]);
}
return cell;
}
Ответ №1:
Похоже, ваша переменная экземпляра appData
не сохраняется.
РЕДАКТИРОВАТЬ: как уже говорили другие, использование свойства — лучший способ. Это сохранит ваши новые appData
, а также объекты выпуска, ранее назначенные там.
Попробуйте изменить:
appData = [[request responseString] componentsSeparatedByString: @"#"];
Для:
self.appData = [[request responseString] componentsSeparatedByString: @"#"];
Ответ №2:
Ваша проблема в основном заключается здесь
appData = [[request responseString] componentsSeparatedByString: @"#"];
Вы назначаете автоматически освобожденный объект appData
, который не является правильным способом, поскольку вы не являетесь владельцем. Вы также не освобождаете права собственности на ранее сохраненные данные. Вы должны использовать метод setter из appData
.
self.appData = [[request responseString] componentsSeparatedByString: @"#"];
это должно быть исправлено.
Ответ №3:
Вы должны использовать свойство ( self.appData
):
self.appData = [[request responseString] componentsSeparatedByString: @"#"];
Ответ №4:
Не знаю, проблема это или нет, скорее всего, нет… Но зачем определять свойство, если вы не используете self.AppData? Вы @synthesize AppData?
Когда вы используете свойства, вызов self.property фактически вызывает сгенерированные установщик и получатель, и они работают так, как указано в свойстве. Итак, если вы укажете свойство с помощью retain , но присвоите самой переменной возвращаемый массив удобства, после цикла событий массив удобства будет автоматически выпущен, и поскольку вы не сохранили массив, он будет удален из памяти, потеряв все, что у вас там было, и что, вероятно, происходит вваш случай.