2012-03-23 36 views
5

Tôi mới tham gia chương trình iOS và có kiến ​​thức hạn chế về iOS và Objective-C, vì vậy, hãy cho tôi một số trợ giúp.iOS Làm thế nào để làm mới ScrollView khi mô hình của nó thay đổi?

Tôi đang làm việc trên ứng dụng ảnh flickr, về cơ bản yêu cầu dữ liệu ảnh từ API flickr và hiện tại trong scrollView.

Nhưng tôi gặp một số sự cố trong phiên bản iPad của tôi, được trình bày bằng UISplitViewController. Hãy để tôi giới thiệu đơn giản về ứng dụng của tôi.

master Xem: một danh sách các UITableViewController nhúng trong UINavigationViewController, về cơ bản nó chỉ sử dụng một số API Flickr để có được một số dữ liệu, hiện tại cái gì đó như thế này:

navigationController ->

tableViewControllerA (ảnh do các nước tổ chức) ->

tableViewControllerB (danh sách ảnh ở quốc gia đó) Khi ảnh được chọn trong TableViewControllerB, trong mã của tôi, tôi chuyển URL ảnh (từ flickr API) đến bộ điều khiển xem chi tiết của tôi là scrollView và đây là mã của tôi trong scrol ViewController của lView.

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); 

và theo quan điểm tổng thể khi một bức ảnh được chọn, tôi đặt DetailView (scrollview) 's tài sản photoURL, vì vậy tôi ghi đè lên các phương pháp setter của 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]; 
} 

mục đích của tôi chỉ khi tôi là mô hình (photoURL) đưa ra, scrollView của tôi sẽ cho tôi imageView tương ứng, nhưng khi ứng dụng của tôi chạy và tôi chọn ảnh, scrollView did't "update", tôi đã học cách cập nhật UITableView (self.tableView reloadData), nhưng Tôi thực sự không biết làm thế nào để làm điều này, xin vui lòng giúp đỡ!

PS:

1 Vui lòng tha thứ cho tiếng Anh nghèo của tôi -_- Tôi đã cố gắng giải thích rõ ràng nhất có thể.

2 tôi không có đủ uy tín để cập nhật hình ảnh để cho các bạn hoàn toàn hiểu những gì ứng dụng của tôi là, hy vọng bạn có thể hiểu được bởi chỉ là những gì tôi đã nói


UPDATE: tôi sử dụng cơ chế KVO thay ghi đè phương thức setter của photoURL, nhưng [self.scrollView setNeedsDisplay] vẫn không hoạt động.

Tôi sử dụng trình gỡ lỗi để theo dõi tiến trình, KVO hoạt động, nhưng không có gì xảy ra sau [self.xxx setNeedsDisplay], tôi hoàn toàn bối rối và không biết phải làm gì.

enter image description here

Trả lời

1

Bạn thực sự nên sử dụng KVO, không trọng các setters:

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

Và nhớ để @synthesize tài sản của bạn!

+0

Cảm ơn sự giúp đỡ của bạn đầu tiên, tôi chưa học được KVO. Tôi sẽ đi qua các tài liệu hướng dẫn của Apple và sau đó kiểm tra nếu nó hoạt động. Cảm ơn ~ – ifournight

+1

... và nhớ removeObserver trong dealloc .... – bandejapaisa

+0

Em ... Cơ chế KVO hoạt động OK, nhưng [self.scrollView setNeedsDisplay] vẫn không có tác dụng gì cả ... – ifournight

0

Gọi [self.view setNeedsLayout] thay vì setNeedsDisplay. Điều này sẽ làm mới tất cả các chế độ xem phụ cho chế độ xem của bạn bao gồm cả scrollView.

0

Tôi có phiên bản Swift và không biết liệu nó có phù hợp với bạn hay không, nhưng nó có hiệu quả đối với tôi.

  1. Just Viết mã của bạn trong viewDidLayoutSubviews() như dưới đây

    override func viewDidLayoutSubviews() { 
    self.scroller.contentSize = CGSize(width: self.view.frame.width, 
    height: self.websiteLabel.frame.maxY + 20) 
    } 
    
  2. Và gọi phương pháp này trong viewDidAppear() như ...

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

Hy vọng điều này sẽ giúp bạn kẻ ..

Các vấn đề liên quan