2012-03-23 4 views
5

Jestem początkującym programistom iOS i mam ograniczoną wiedzę na temat iOS i Objective-C, więc proszę o pomoc.iOS Jak odświeżyć ScrollView po zmianie modelu?

Pracuję nad aplikacją flickr photo, która zasadniczo wymaga danych zdjęciowych z interfejsu API flickr i przedstawia go w scrollView.

Ale napotkam pewien problem w mojej wersji na iPada, przedstawiony z UISplitViewController. Pozwól mi podać proste wprowadzenie do mojej aplikacji.

MASTER Widok: lista UITableViewController osadzone w UINavigationViewController, w zasadzie to po prostu korzystać z niektórych Flickr API, aby uzyskać pewne dane, występuje coś takiego:

navigationController ->

tableViewControllerA (Zdjęcia organizowane przez kraje) ->

tableViewControllerB (lista zdjęć w tym kraju) Po wybraniu zdjęcia w TableViewControllerB, w moim kodzie przekazuję URL zdjęcia (z Flickr API) do mojego kontrolera widoku szczegółów, który jest scrollView, a tutaj jest mój kod w scrol lView's 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); 

iw świetle nadrzędnego, gdy obraz jest wybrana, ustawić detailView (Scrollview) to właściwość photoURL, więc zastąpić metodę setter 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]; 
} 

moim celem jest tylko kiedy mój model (photoURL) daje, mój scrollView powinien dać mi odpowiedni imageView, ale kiedy uruchomiam aplikację i wybieram zdjęcie, scrollView nie "zaktualizował", już nauczyłem się aktualizować UITableView (self.tableView reloadData), ale Naprawdę nie wiem, jak to zrobić, proszę o pomoc!

PS:

1 Proszę wybaczyć mój słaby angielski -_- ja już próbowałem wyjaśnić jak najdalej.

2 nie mam wystarczająco dużo reputacji, aby zaktualizować obraz pozwolić ci faceci w pełni zrozumieć, co moja aplikacja jest, nadzieję, że można zrozumieć tylko przez to, co powiedziałem


UPDATE: używam zamiast mechanizmu KVO nadpisania metody ustawiającej photoURL, ale [self.scrollView setNeedsDisplay] nadal nie działa.

Używam debuggera do śledzenia postępu, KVO działa, ale nic się nie dzieje po [self.xxx setNeedsDisplay], jestem całkowicie zdezorientowany i nie wiem co robić.

enter image description here

Odpowiedz

1

Należy właściwie używać KVO nie przesłanianie ustawiające:

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

I pamiętaj, aby @synthesize swoje właściwości!

+0

Dzięki za twoją pomoc, nie nauczyłem się jeszcze KVO. Przejdę do przewodnika po dokumentacji Apple, a następnie przetestuję, czy działa. Dzięki ~ – ifournight

+1

... i pamiętaj, aby usunąćObserver w dealloc .... – bandejapaisa

+0

Em ... Mechanizm KVO działa OK, ale [self.scrollView setNeedsDisplay] nadal nie ma żadnego efektu ... – ifournight

0

Wywołanie [self.view setNeedsLayout] zamiast setNeedsDisplay. Spowoduje to odświeżenie wszystkich widoków podrzędnych dla widoku, w tym scrollView.

0

Mam wersję Swift i nie wiem, czy to zadziała, czy nie, ale zadziałało to dla mnie.

  1. Wystarczy napisać swój kod w viewDidLayoutSubviews() jak poniżej

    override func viewDidLayoutSubviews() { 
    self.scroller.contentSize = CGSize(width: self.view.frame.width, 
    height: self.websiteLabel.frame.maxY + 20) 
    } 
    
  2. I wywołać tę metodę w viewDidAppear() jak ...

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

Nadzieja będzie to wy Pomoc ..