Цель C iPhone. Получение NSMutableArray в таблице - PullRequest
0 голосов
/ 19 сентября 2010

Я пытаюсь получить данные массива в TableView, но постоянно получаю ошибку доступа. Мой код выглядит так:

NewsViewController.h

#import "StatusMessage.h"

@interface NewsViewController : UIViewController {
    IBOutlet UITableView *table;
    NSMutableArray *statusMessages; 
}

@property(nonatomic, retain) NSMutableArray *statusMessages;

@end

NewsViewController.m

#import "NewsViewController.h"
#import "TBXML.h"

@implementation NewsViewController

@synthesize statusMessages;

-(void) getXML {
    //some XML things parsing above

    for (int i = 0; i smaller [allMessages count]; i++) {
        statusMessage *temp = [[StatusMessage alloc]init];

        NSLog(@"retain count %d", [statusMessages retainCount]); //is 1
        [temp initstatusMessage: str1:str2:str3:str4];

        [statusMessages addObject: temp];
        NSLog(@"retain count %d", [statusMessages retainCount]); // is 1
        [temp release];
    }   
}

-(void) getLda {    
    self.getXML;
    NSLog(@"retain count %d", [statusMessages retainCount]); // is 1

    NSComparisonResult dateSort(StatusMessage *d1, StatusMessage *d2, void *context) {
        return [[d2 getDate] compare:[d1 getDate]];
    }       

    [statusMessages sortUsingFunction:dateSort context:nil];
}

- (void)loadView {
    [[self navigationController] setNavigationBarHidden:NO animated:NO];
    table.backgroundColor = [UIColor clearColor];   
    [super loadView];
}



- (void)viewDidLoad {   
    [super viewDidLoad];

    statusMessages = [[NSMutableArray alloc] initWithObjects:nil];  
    NSLog(@"retain count %d", [statusMessages retainCount]); // is 1    

    self.getLda;
    NSLog([[statusMessages objectAtIndex:1] getText]); //works fine for every index
}

- (void)dealloc {
    [statusMessages release];   
    [super dealloc];    
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [statusMessages count];
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return 1;   
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(@"retain count %d", [statusMessages retainCount]); // is 1 every time

    static NSString *CellIdentifier = @"Cell";

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

    cell.textLabel.text = [[statusMessages objectAtIndex:indexPath.section] getText];
    cell.textLabel.font = [UIFont systemFontOfSize:15];

    return cell;    
}

NewsMessage.h

#import 


@interface statusMessage : NSObject {
    NSString *source;
    NSString *text;
    NSString *date;
    NSURL    *link; 
}

-(void) initstatusMessage: (NSString *) s: (NSString *) t: (NSString *) l:(NSString *) d;
-(NSString *) getText;
-(NSDate   *) getDate;

@end

NewsMessage.m

#import "statusMessage.h"


@implementation statusMessage

-(void) initstatusMessage: (NSString *) s: (NSString *) t: (NSString *) l:(NSString *) d {
    source = s;
    link   = [[NSURL alloc] initWithString:l];

    text = t;

    NSDateFormatter *formatter = [[[NSDateFormatter alloc] init] autorelease];
    [formatter setDateFormat:@"yyyy-MM-ddeHH:mm:ssZZZZ"];
    date = [formatter dateFromString: d]; 
}

-(NSString *) getText {
    return (NSString *) CFURLCreateStringByReplacingPercentEscapesUsingEncoding (kCFAllocatorDefault , text, CFSTR(""), kCFStringEncodingUTF8);
}

-(NSDate *) getDate {
    return date;
}

@end

Я просто не могу получить доступ к данным в cellForRowAtIndexPath-Method.

Ответы [ 3 ]

1 голос
/ 19 сентября 2010

3.(и, надеюсь, последний) ОБНОВЛЕНИЕ:

Когда вы передаете аргумент функции, аргумент не сохраняется.То же самое верно для назначения переменных.Другими словами:

source = s; text = t; date = [formatter dateFromString: d]; 

не сохраняются вашим классом (ссылка ... однако, поскольку вы используете «alloc»).Итак, используйте

source = [s retain];
text = [t retain];
date = [[formatter dateFromString: d]retain];

и все будет в порядке.Не забудьте выпустить их в свой dealloc.

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

Надеюсь, у нас это есть сейчас!это было предположение.]

1 голос
/ 20 сентября 2010

Вы также чрезмерно сохраняете свой массив, вы делаете:

[[NSMutableArray alloc] initWithObjects:nil] retain];

когда вам действительно нужно:

[[NSMutableArray alloc] initWithObjects:nil];

Так как alloc / init оставляет также и счет удержания равным единице.

1 голос
/ 19 сентября 2010

установка табличного представления - это не просто метод cellForRowAtIndexPath. Есть некоторые другие методы, которые вы должны реализовать. например,

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

и еще немного. это зависит также от того, что вы хотите, чтобы ваш стол мог. Вы должны составить руководство по просмотру таблицы или заглянуть в файл учебного проекта, где вы найдете все важные вещи, которые вам нужно сделать. (Google для "учебника uitableview", в Интернете так много всего ...)

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