Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在UIViewController上加载数据:viewDidLoad和ViewWillDisplay-正确的逻辑是什么?_Iphone_Ios_Viewdidload_Viewwillappear - Fatal编程技术网

Iphone 在UIViewController上加载数据:viewDidLoad和ViewWillDisplay-正确的逻辑是什么?

Iphone 在UIViewController上加载数据:viewDidLoad和ViewWillDisplay-正确的逻辑是什么?,iphone,ios,viewdidload,viewwillappear,Iphone,Ios,Viewdidload,Viewwillappear,我有一个tabBarControllerView,第三个选项卡中有一个UIScrollViewController。我正在加载基本相同的东西,核心数据的图片,在viewDidLoad和ViewWill中显示。我认为ViewWillDisplay是我可以用来在UIScrollView中更新视图的工具。唯一的问题是,当我将图片添加到核心数据时,没有显示正确的图片 我想知道是我的视图显示逻辑还是我的上下文关闭了?我正在修复我的上下文,所以如果我的逻辑是正确的(减去ManagedObjectContex

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

我想知道是我的视图显示逻辑还是我的上下文关闭了?我正在修复我的上下文,所以如果我的逻辑是正确的(减去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
#导入
#导入“PhotoViewController.h”
@接口MyTabBarViewController:UIViewController
{
IBUIPageControl*pageControl;
IBUIScrollView*滚动条;
UIImage*图像;
cgf宽度;
整数页码;
}
@属性(非原子,保留)IBUIPageControl*pageControl;
@属性(非原子,保留)IBUIScrollView*滚动条;
-(iAction)单击页面控制:(id)发件人;
@结束
实现文件。。。相关片段

- (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];
}
-(void)viewDidLoad
{
[超级视图下载];
scroller.delegate=self;
scroller.PaginEnabled=是;
scroller.directionalLockEnabled=是;
scroller.showshorizontalscrolindicator=NO;
scroller.showsVerticalScrollIndicator=否;
scroller.contentSize=CGSizeMake(pageControl.numberOfPages*scroller.frame.size.width,scroller.frame.size.height);
滚动宽度=0;
页码=0;
NSFetchRequest*request=[[NSFetchRequest alloc]init];
NSManagedObjectContext*上下文=[(CoreDataProjAppDelegate*)[[UIApplication sharedApplication]委托]managedObjectContext];
request.entity=[NSEntityDescription entityForName:@“Photo”inManagedObjectContext:context];
n错误*错误=nil;
NSArray*fetchCount=[context executeFetchRequest:request error:&error];
int pageCount=[fetchCount];

for(int i=pageNumber;i我不知道这是否是真正的原因,但我注意到的一点是,在for循环中,您正在手动递增
pageNumber++
,我不完全确定原因。如果您在循环中获取
pageNumber
的任何内部引用(我只看到您正在立即设置标签文本的行)换成
i
,我相信这会让你正确地显示你的图像。简言之,只需从代码中取出
pageNumber
(除非有我明显忽略的东西),然后使用
for(int i=0;i
。如果没有更多,这将使您能够更好地控制循环,并消除每个循环增量期间的任何变化。至于使用哪种方法,最好在
视图中实现代码,因为它将使视图有更多的机会加载,并在显示im时为您提供适当的尺寸年龄

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

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

我将尝试你的建议。但我选择不在循环中使用I的原因是,如果核心数据中有2个对象要启动,然后在重新加载时有5个对象,那么我想在第3页(5-2)上启动循环。因此我的想法可能不正确,但这就是为什么我要使用页码,因为它应该在第3页(或任何数字)。不,那不起作用。谢谢你的建议,尽管slev:-)哦,我明白了。在这种情况下,我当然可以看到您的逻辑,以保持页面具有正确数量的图像。我不确定我是否真的看到图像关闭的任何原因。您是否同时调用
viewDidLoad
viewwillbeen
中的代码?在第一次运行时,它们可能会相互碰撞,扭曲什么图片会去哪里。此外,在设置照片对象时,您可能会遇到内存泄漏。设置新图像后,我会释放照片*照片,或者不使用alloc/init,只需调用
Photo*Photo=[fetchCount objectAtIndex:I]
再次感谢Slev。我修复了内存泄漏:-)很高兴你指出了这一点。是的,我仍然不知道为什么这不起作用。我认为ManagedObjectContext与此有关。我将继续玩弄它。实际上,我刚刚想到了一些事情。虽然在键入之后,这对注释来说太长了,所以我将编辑我的原始答案以将其放入好了,我想这可能是给你带来麻烦的原因