【问题标题】:iOS How to refresh ScrollView when its model change?iOS 如何在其模型更改时刷新 ScrollView?
【发布时间】:2012-04-08 01:56:33
【问题描述】:

我是 iOS 编程新手,对 iOS 和 Objective-C 了解有限,所以请给我一些帮助。

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

但我在 iPad 版本中遇到了一些问题,显示为 UISplitViewController。 让我简单介绍一下我的应用。

MASTER VIEW:嵌入在 UINavigationViewController 中的 UITableViewController 列表,基本上它只是使用一些 Flickr API 来获取一些数据,呈现如下:

导航控制器->

tableViewControllerA(按国家整理的照片)->

tableViewControllerB(该国家/地区的照片列表) 当在 TableViewControllerB 中选择照片时,在我的代码中,我将照片 URL(来自 flickr API)传递给我的详细视图控制器,它是一个滚动视图,这是我在滚动视图的 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(scrollView)的属性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 我没有足够的声望来更新图片让你们充分了解我的应用程序是什么,希望你们能理解我所说的


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

我使用调试器跟踪进度,KVO 工作,但 [self.xxx setNeedsDisplay] 之后没有任何反应,我完全糊涂了,不知道该怎么办。

【问题讨论】:

    标签: iphone objective-c ios uiscrollview


    【解决方案1】:

    我有 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()       
      }
      

    希望这对你们有帮助..

    【讨论】:

      【解决方案2】:

      您实际上应该使用 KVO,而不是覆盖设置器:

      -(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你的属性!

      【讨论】:

      • 先谢谢你的帮助,我还没学过KVO。我将阅读 Apple 文档指南,然后测试它是否有效。谢谢~
      • Em... KVO 机制工作正常,但是 [self.scrollView setNeedsDisplay] 仍然完全没有效果...
      • @user1228230 你应该在主线程上使用 dispatch_async 块。
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-11-09
        • 2011-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-04
        • 2021-12-18
        相关资源
        最近更新 更多