2012-03-23 16 views
5

मैं आईओएस प्रोग्रामिंग के लिए नया हूं और आईओएस और उद्देश्य-सी के सीमित ज्ञान है, इसलिए कृपया मुझे कुछ मदद दें।आईओएस स्क्रॉलव्यू रीफ्रेश कैसे करें जब उसका मॉडल बदलता है?

मैं एक फ़्लिकर फोटो ऐप पर काम कर रहा हूं, जिसे मूल रूप से फ़्लिकर एपीआई से फोटो डेटा की आवश्यकता होती है और स्क्रॉल व्यू में मौजूद है।

लेकिन मुझे अपने आईपैड संस्करण में कुछ समस्याएं मिलती हैं, जो UISplitViewController के साथ प्रस्तुत की जाती है। मुझे अपने ऐप का एक सरल परिचय दें।

मास्टर दृश्य: UITableViewController की एक सूची UINavigationViewController में एम्बेडेड, मूल रूप से यह सिर्फ कुछ फ़्लिकर एपीआई का उपयोग कुछ डेटा, इस तरह वर्तमान कुछ पाने के लिए:

navigationController ->

tableViewControllerA (देशों द्वारा आयोजित फोटो) ->

tableViewControllerB (उस देश में फोटो सूची) जब तस्वीर TableViewControllerB में चुना जाता है, मेरे कोड में मैं तस्वीर यूआरएल (फ़्लिकर एपीआई से) पास जो एक 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]; 
} 

मेरा उद्देश्य सिर्फ जब मेरी है मॉडल (photoURL) देते हैं, मेरी स्क्रॉलव्यू मुझे मुझे संबंधित छवि दृश्य देना चाहिए, लेकिन जब मेरा ऐप चलता है और मैं एक फोटो चुनता हूं, तो स्क्रॉल व्यू "अपडेट नहीं होता", मैंने पहले से ही UITableView (self.tableView reloadData) को अपडेट करने का तरीका सीखा है, लेकिन मैं वास्तव में नहीं जानता कि यह कैसे करें, कृपया मदद करें!

पुनश्च:

1 कृपया मेरे गरीब अंग्रेजी माफ -_- मैं पहले से ही संभव के रूप में स्पष्ट समझाने की कोशिश की।

2 मैं छवि को अद्यतन करने के तुम लोगों को पूरी तरह समझ क्या मेरे अनुप्रयोग है यह बताने के लिए पर्याप्त प्रतिष्ठा नहीं है, आशा है कि आप मैं सिर्फ क्या कहा


अद्यतन द्वारा समझ सकते हैं: मैं KVO तंत्र के बजाय का उपयोग करें photoURL की सेटर विधि को ओवरराइड करने के लिए, लेकिन [self.scrollView setNeedsDisplay] अभी भी काम नहीं करता है।

मैं प्रगति को ट्रैक करने के लिए डीबगर का उपयोग करता हूं, केवीओ काम करता है, लेकिन [self.xxx setNeedsDisplay] के बाद कुछ नहीं होता है, मैं पूरी तरह उलझन में हूं और नहीं जानता कि क्या करना है।

enter image description here

उत्तर

1

आप वास्तव में KVO का उपयोग करना चाहिए, 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]; 
    } 
} 

और अपने गुण @synthesize के लिए याद!

+0

पहले आपकी मदद के लिए धन्यवाद, मैंने अभी तक केवीओ नहीं सीखा है। मैं ऐप्पल प्रलेखन मार्गदर्शिका के माध्यम से जाऊंगा और फिर परीक्षण करता हूं तो परीक्षण करता है। धन्यवाद ~ – ifournight

+1

... और dealloc में ऑब्सर्वर को निकालना याद रखें .... – bandejapaisa

+0

एम ... केवीओ तंत्र ठीक काम करता है, लेकिन [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() में अपने कोड लिखें और viewDidAppear() की तरह इस विधि कॉल ...

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

आशा इस तुम लोग मदद करेंगे ..

संबंधित मुद्दे