gpt4 book ai didi

iphone - 在 UIViewController 上加载数据 : viewDidLoad and viewWillAppear - What is the proper logic?

转载 作者:行者123 更新时间:2023-11-29 05:02:42 25 4
gpt4 key购买 nike

我有一个 tabBarControllerView,其第三个选项卡中有一个 UIScrollViewController。我在 viewDidLoad 和 viewWillAppear 中加载本质上相同的东西,即来自核心数据的图片。我认为 viewWillAppear 可以用来更新 UIScrollView 中的 View 。唯一的问题是,当我将图片添加到核心数据时,没有显示正确的图片。

我想知道这是我的 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];
}

最佳答案

我不知道这是否是真正的原因,但我注意到的一件事是,在 for 循环中,您正在手动递增 pageNumber++我不太清楚为什么。如果您获取 pageNumber 的任何内部引用在循环中(我只看到您临时设置标签文本的行)并将其替换为 i ,我相信这应该可以让您正确显示图像。简而言之,只需取 pageNumber在代码之外(除非有一些我明显忽略的东西)并使用 for (int i = 0; i < pageCount; i++) { .如果没有更多的话,这将使您能够更好地控制循环并消除每个循环增量期间的任何变化。至于使用哪种方法,最好是实现 viewWillAppear 中的代码。因为它会让 View 有更多的机会加载并在显示图像时为您提供正确的尺寸。

编辑:如果您希望按特定顺序显示图像,则无法直接通过从 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];

这样做应该让您实际指定要显示图像的顺序,可以按添加日期或整数索引(您必须将其作为属性添加到实体)

关于iphone - 在 UIViewController 上加载数据 : viewDidLoad and viewWillAppear - What is the proper logic?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6508643/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com