2012-03-23 12 views
5

我是iOS编程新手,对iOS和Objective-C知识有限,请给我一些帮助。iOS如何在模型更改时刷新ScrollView?

我正在开发一个flickr照片应用程序,它基本上需要来自flickr API的照片数据并在scrollView中显示。

但我在我的iPad版本中遇到了一些问题,用UISplitViewController提供。 让我给我一个简单的介绍我的应用程序。

MASTER VIEW:嵌入UINavigationViewController,基本上它只是使用一些Flickr的API来获取一些数据,目前像这样的UITableViewController的列表:

navigationController - >

tableViewControllerA(由国家组织的照片) - >

tableViewControllerB(在该国照片列表) 当TableViewControllerB被选择的照片,在我的代码我通过照片URL(从Flickr API)到我的详细视图控制器,其是滚动型,这里是我的代码在滚动lView的ViewController。

IBOutlet UIScrollView *scrollView; 
IBOutlet UIImageView *imageView; 
NSURL *photoURL; 


- (void) viewDidLoad 
{ 
    [super viewDidLoad]; 

    dispatch_queue_t downloadQueue = dispatch_queue_create("flickr donwloader", NULL); 
dispatch_async(downloadQueue, ^{ 
    // load image 
    self.imageView.image = [UIImage imageWithData: [NSData dataWithContentsOfURL:self.photoURL]]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     // configure scrollView and imageView 
     CGSize photoSize = self.imageView.image.size; 

     self.scrollView.delegate = self; 
     [self.scrollView setZoomScale:1.00]; 
     [self.scrollView setMinimumZoomScale:0.5]; 
     [self.scrollView setMaximumZoomScale:1.00]; 
     self.scrollView.contentSize = photoSize; 

     self.imageView.frame = CGRectMake(0, 0, photoSize.width, photoSize.height); 

     CGPoint scrollCenter = self.scrollView.center; 
     self.imageView.center = scrollCenter; 
    }); 
}); 
dispatch_release(downloadQueue); 

和在主视图当选择了图像,我设置的DetailView(滚动视图)的财产photoURL,所以我重写photoURL的setter方法

-(void) setPhotoURL:(NSURL *)photoURL 
{ 
    // do something to refresh my scrollView, below are something I already tried 
    self.imageView.image = [UIImage imageWithData: [NSData dataWithContentsOfURL:self.photoURL]]; 
    [self.scrollView setNeedsDisplay]; 
    [self.view setNeedsDisplay]; 
    [self.imageView setNeedsDisplay]; 
} 

我的目的只是当我的模型(photoURL)给,我scrollView应该给我相应的imageView,但是当我的应用程序运行,我选择了一张照片,scrollView没有“更新”,我已经学会了如何更新UITableView(self.tableView reloadData),但我真的不知道该怎么做,请帮忙!

PS:

1请原谅我的英语太差-_-我已经试图解释尽可能明确。

2我没有足够的信誉来更新图像,让你们完全理解我的应用程序是什么,希望你可以通过刚才我说


UPDATE明白: 我用KVO机制,而不是覆盖了photoURL的setter方法,但[self.scrollView setNeedsDisplay]仍然不起作用。

我使用调试器来跟踪进度,KVO的作品,但[self.xxx setNeedsDisplay]后,没有发生任何事情,我完全困惑,不知道该怎么做。

enter image description here

回答

1

你实际上应使用国际志愿者组织,不重写setter方法:

-(void) viewDidLoad 
{ 
    ... 
    [self addObserver:self forKeyPath:@"photoURL" options:0 context:NULL]; 
    ... 
} 

-(void) observeValueForKeyPath:(NSString *) keyPath ofObject:(id) object change:(NSDictionary *) change context:(void *) context 
{ 
    if ([keyPath isEqualToString:@"photoURL"]) 
    { 
     self.imageView.image = [UIImage imageWithData: [NSData dataWithContentsOfURL:self.photoURL]]; 
     [self.scrollView setNeedsDisplay]; 
     [self.view setNeedsDisplay]; 
     [self.imageView setNeedsDisplay]; 
    } 
} 

要记住,你的@synthesize性能!

+0

首先感谢您的帮助,我还没有学会KVO。我将阅读Apple文档指南,然后测试它是否可行。谢谢〜 – ifournight 2012-03-23 14:29:18

+1

...并记住removeallObserver在dealloc .... – bandejapaisa 2012-03-23 14:31:14

+0

Em ... KVO机制工作正常,但[self.scrollView setNeedsDisplay]仍然没有任何影响... – ifournight 2012-03-23 14:46:28

0

调用[self.view setNeedsLayout]而不是setNeedsDisplay。 这将刷新视图的所有子视图,包括scrollView。

0

我有Swift版本,不知道它是否适用于您,但它对我有用。

  1. 只是写在viewDidLayoutSubviews()你的代码像下面

    override func viewDidLayoutSubviews() { 
    self.scroller.contentSize = CGSize(width: self.view.frame.width, 
    height: self.websiteLabel.frame.maxY + 20) 
    } 
    
  2. 而且在viewDidAppear()像调用此方法...

    override func viewDidAppear(_ animated: Bool) { 
    super.viewDidAppear(animated) 
    viewDidLayoutSubviews()  
    } 
    

希望这将帮助你们..

相关问题