2012-03-23 23 views
5

私はiOSプログラミングが初めてで、iOSとObjective-Cの知識が限られていますので、何か助けてください。iOSモデルが変更されたときにScrollViewを更新する方法は?

私はflickrの写真アプリに取り組んでいます。これは、基本的にはflickr APIの写真データを必要とし、scrollViewに表示します。

しかし私はUISplitViewControllerで提示された私のiPad版でいくつかの問題を抱えています。 私のアプリの簡単な紹介をしましょう。

マスタービュー:UINavigationViewControllerに埋め込まのUITableViewControllerのリスト、基本的にはそれだけで、このような存在な何か、いくつかのデータを取得するために、いくつかのFlickrのAPIを使用します。

navigationController - >

tableViewControllerA(国によって組織の写真) -

tableViewControllerB(その国の写真リスト) 写真がTableViewControllerBで選択されているとき、私のコードでは、写真URL(flickr APIから)をscrollViewである詳細ビューコントローラに渡します。スクロールで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(scrollViewを)設定のプロパティphotoURL、私はphotoURL

-(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]; 
} 

のsetterメソッドをオーバーライドし、私の目的は、ちょうど私ですモデル(photoURL)を与えると、私のscrollViewは、私に対応するimageViewを与える必要がありますが、私のアプリが実行され、写真を選択すると、scrollView did't "更新"、私はすでにUITableView(self.tableView reloadData)私は本当にこれを行う方法がわからない、助けてください!

PS:

1私の下手な英語を許してください-_-私はすでに、可能な限り明確に説明しようとしました。私はあなたたちは完全に私のアプリが何であるかを理解できるようにイメージを更新するのに十分な評判を持っていない

2は、あなたは私が言っただけで何


UPDATEによって理解することができます願っています: を私が代わりにKVOメカニズムを使用しますphotoURLのsetterメソッドをオーバーライドしますが、[self.scrollView setNeedsDisplay]はまだ動作しません。

私はデバッガを使って進行状況を追跡しますが、KVOは動作しますが、[self.xxx setNeedsDisplay]の後に何も起こりません。私は完全に混乱して何をすべきか分かりません。あなたが実際にセッターをオーバーライドしていない、KVOを使用する必要があります

enter image description here

答えて

1

-(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

+1

... deallocでremoveObserverを覚えています.... – bandejapaisa

+0

Em ... KVOのメカニズムは正常に動作しますが、[self.scrollView setNeedsDisplay]はまったく効果がありません... – ifournight

0

setNeedsDisplayの代わりに[self.view setNeedsLayout]を呼び出します。 これは、scrollViewを含むビューのすべてのサブビューを更新します。

0

私はスウィフトバージョンを持っていて、それがあなたのために働くかどうか分からないが、それは私のために働いた。

  1. だけ

    override func viewDidLayoutSubviews() { 
    self.scroller.contentSize = CGSize(width: self.view.frame.width, 
    height: self.websiteLabel.frame.maxY + 20) 
    } 
    
  2. 以下のようにviewDidLayoutSubviews()でコードを書いて、これはあなたたちを助けることを願っています

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

...のようにviewDidAppear()でこのメソッドを呼び出します..

関連する問題