Загрузка данных в UIViewController: viewDidLoad и viewWillAppear - Какая логика правильная? - PullRequest
0 голосов
/ 28 июня 2011

У меня есть tabBarControllerView с UIScrollViewController в его третьей вкладке. Я загружаю по существу то же самое, изображения из основных данных, в viewDidLoad и viewWillAppear. Я думаю, что viewWillAppear - это то, что я могу использовать для обновления представления в UIScrollView. Единственное, когда я добавляю картинки к основным данным, правильная картинка не отображается.

Мне интересно, является ли это моей логикой viewWillAppear или мой контекст отключен? Я работаю над исправлением своего контекста, поэтому, если моя логика верна (за исключением ManagedObjectContext), это будет здорово услышать - я могу вернуться к работе над проблемой контекста.

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

Заголовочный файл

#import <UIKit/UIKit.h>
#import "PhotoViewController.h"

@interface MyTabBarViewController  : UIViewController<UIScrollViewDelegate>
{

    IBOutlet UIPageControl *pageControl;
    IBOutlet UIScrollView *scroller;
    UIImage *image;
    CGFloat scrollWidth;
    int pageNumber;
}

@property (nonatomic,retain)IBOutlet UIPageControl *pageControl;
@property (nonatomic,retain)IBOutlet UIScrollView *scroller;

-(IBAction)clickPageControl:(id)sender;

@end

Файл реализации ... соответствующие фрагменты

- (void)viewDidLoad
{
    [super viewDidLoad];
    scroller.delegate=self;
    scroller.pagingEnabled=YES;
    scroller.directionalLockEnabled=YES;
    scroller.showsHorizontalScrollIndicator=NO;
    scroller.showsVerticalScrollIndicator=NO;
    scroller.contentSize=CGSizeMake(pageControl.numberOfPages*scroller.frame.size.width, scroller.frame.size.height);
    scrollWidth = 0;
    pageNumber = 0;
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *context = [(CoreDataProjAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    request.entity = [NSEntityDescription entityForName:@"Photo" inManagedObjectContext:context];
    NSError *error = nil;
    NSArray *fetchCount = [context executeFetchRequest:request error:&error];
    int pageCount = [fetchCount count];
    for (int i=pageNumber; i<pageCount; i++)
    {
        PhotoViewController *pvc = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];
        CGRect rect = scroller.frame;
        rect.size.height = scroller.frame.size.height;
        rect.size.width = scroller.frame.size.width;
        rect.origin.x = scroller.frame.origin.x + scrollWidth;
        rect.origin.y = scroller.frame.origin.y;
        pvc.view.frame  = rect;
        [pvc view];
        pvc.label.text = [NSString stringWithFormat:@"%d", pageNumber];
        pvc.label.textColor = [UIColor redColor];
        Photo *photo = [[Photo alloc] init];
        photo = [fetchCount objectAtIndex:i];
        UIImage *fetchedImage = [UIImage imageWithData:photo.photo];
        pvc.imageView.image = fetchedImage;
        [scroller addSubview:pvc.view];
        [pvc release];
        pageNumber++;
        scrollWidth += scroller.frame.size.width;
    }
    pageControl.numberOfPages=pageCount;
    pageControl.currentPage=0;
    [self.view addSubview:scroller];
    [request release];
}

- (void) viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:YES];
    scroller.delegate=self;
    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSManagedObjectContext *context = [(CoreDataProjAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
    request.entity = [NSEntityDescription entityForName:@"Photo" inManagedObjectContext:context];
    NSError *error = nil;
    NSArray *fetchCount = [context executeFetchRequest:request error:&error];
    int pageCount = [fetchCount count];
    scroller.contentSize=CGSizeMake(pageCount*scroller.frame.size.width, scroller.frame.size.height);
    for (int i=pageNumber; i<pageCount; i++)
    {
        PhotoViewController *pvc = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];
        CGRect rect = scroller.frame;
        rect.size.height = scroller.frame.size.height;
        rect.size.width = scroller.frame.size.width;
        rect.origin.x = scroller.frame.origin.x + scrollWidth;
        rect.origin.y = scroller.frame.origin.y;
        pvc.view.frame  = rect;
        [pvc view];
        pvc.label.text = [NSString stringWithFormat:@"%d", pageNumber];
        pvc.label.textColor = [UIColor redColor];
        Photo *photo = [[Photo alloc] init];
        photo = [fetchCount objectAtIndex:i];
        UIImage *fetchedImage = [UIImage imageWithData:photo.photo];
        pvc.imageView.image = fetchedImage;
        [scroller addSubview:pvc.view];
        [pvc release];
        pageNumber++;
        scrollWidth += scroller.frame.size.width;
    }
    pageControl.numberOfPages=pageCount;
    pageControl.currentPage=0;
    [self.view addSubview:scroller];
    [request release];
}

1 Ответ

1 голос
/ 28 июня 2011

Я не знаю, является ли это реальной причиной, но я замечаю одну вещь: в вашем цикле for вы вручную увеличиваете pageNumber++, и я не совсем уверен, почему.Если вы возьмете любую внутреннюю ссылку на pageNumber в цикле (я вижу только строку, где вы устанавливаете текст надписи от руки) и замените ее на i, я считаю, что это должно позволить вам правильно отображать ваши изображения.Короче, просто извлеките pageNumber из кода (если я что-то явно упускаю из виду) и просто используйте for (int i = 0; i < pageCount; i++) {.Если ничего более, это даст вам больше контроля над вашим циклом и исключит любые изменения во время каждого приращения цикла.Что касается того, какой метод использовать, то, скорее всего, лучше всего реализовать код в viewWillAppear, поскольку он даст больше возможностей для загрузки и даст вам правильные размеры при отображении ваших изображений.

РЕДАКТИРОВАТЬ:Если вы хотите отобразить изображения в определенном порядке, вы не сможете сделать это напрямую, извлекая объекты из managedObjectContext, поскольку он хранит свои объекты как NSSet (неиндексированный).Если вы хотите отображать картинки в определенном порядке, вам нужно будет использовать дескриптор сортировки.Поэтому, когда вы создаете запрос, вам нужно выполнить что-то вроде этого:

NSFetchRequest *request = [[NSFetchRequest alloc] init];
NSManagedObjectContext *context = [(CoreDataProjAppDelegate *)[[UIApplication sharedApplication] delegate] managedObjectContext];
request.entity = [NSEntityDescription entityForName:@"Photo" inManagedObjectContext:context];
NSError *error = nil;
NSSortDescriptor *sorter = [NSSortDescriptor sortDescriptorWithKey:@"someAttributeToIndex" ascending:YES];
[request setSortDescriptors:[NSArray arrayWithObject:sorter]];
NSArray *fetchCount = [context executeFetchRequest:request error:&error];

Это позволит вам фактически указать порядок, в котором вы хотите представить изображения, либо по дате добавления, либоцелочисленный индекс (который вы должны будете добавить в качестве атрибута к сущности)

...