2016-07-04 7 views
5

देखने के लिए वापस जाने पर टेबलव्यू के शीर्ष पर नियंत्रण ताज़ा करें किसी कारण से, पहली बार व्यू कंट्रोलर लोड हो जाता है, ताज़ा नियंत्रण अपेक्षित व्यवहार करता है (यह, नीचे स्वाइप होने पर तालिकादृश्य के नीचे दिखा रहा है)। समस्या यह है कि जब मैं किसी अन्य टैब पर टैप करता हूं, और फिर दृश्य नियंत्रक पर वापस जाता हूं, तो रीफ्रेश नियंत्रण अब और फीका नहीं होता है और तालिकादृश्य के शीर्ष पर दिखाई देता है।कंट्रोलर

When I go back to view controller

इस कोड का हिस्सा है:

class CoreTableViewController : UIViewController, UITableViewDataSource, UITableViewDelegate { 

var tableView:UITableView! 
var tableData:Array<AnyObject> = [] 
var dataFetched:Bool = false 
var refreshControl:UIRefreshControl? 

override func viewDidLoad() { 
    super.viewDidLoad() 

    self.edgesForExtendedLayout = UIRectEdge.None; 

    self.tableView = self.assignTableView() 
    self.tableView.delegate = self 
    self.tableView.dataSource = self 
    self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "Cell") 
    self.tableView.separatorStyle = UITableViewCellSeparatorStyle.None; 

    if self.enableRefresher() { 
     self.setRefreshControl() 
    } 
} 

func enableRefresher() -> Bool { 
    return true 
} 

func fetchData(cleanFirst:Bool = false) { 
    // Fetch data. 
} 

func refresh() { 
    self.fetchData(true) 
    self.refreshControl!.endRefreshing() 
} 

func setRefreshControl() { 
    self.refreshControl = UIRefreshControl() 
    //self.refreshControl!.attributedTitle = NSAttributedString(string: "Actualizar") 
    self.refreshControl!.addTarget(self, action: #selector(CoreTableViewController.refresh), forControlEvents: UIControlEvents.ValueChanged) 
    self.tableView.addSubview(refreshControl!) 
} 

} 

किसी भी विचार?

+0

कृपया इसे स्पष्ट रूप से विस्तृत करें, मुझे समझ में नहीं आता कि आप क्या चाहते हैं और आपको –

उत्तर

0

मैं अपने कोड और अपने प्रश्न की जांच के रूप में, मुझे लगता है कि समस्या यहाँ है:

"एक तालिका दृश्य नियंत्रक के refreshControl संपत्ति के लिए एक ताज़ा नियंत्रण बताए के अलावा, आप लक्ष्य और नियंत्रण की कार्रवाई को कॉन्फ़िगर करना होगा अपने आप।" https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIRefreshControl_class/index.html#//apple_ref/occ/instm/UIRefreshControl/endRefreshing

तो, दस्तावेज़ीकरण से, आपको UIViewCiewController का उपयोग करने की आवश्यकता है, UIViewController नहीं। और इसे रीफ्रेश करें कंट्रोल संपत्ति सेट करें।

वर्तमान स्थिति में, आप केवल नियमित सबव्यू के रूप में UIRefreshControl जोड़ते हैं।

+0

क्या मिल रहा है यदि आप संग्रह दृश्य का उपयोग करना चाहते हैं? संग्रह संग्रह के अंदर ताज़ा नियंत्रण के साथ मुझे बिल्कुल वही समस्या है। – Ricardo

+0

@ रिकार्डो, संग्रह दृश्य दस्तावेज़ देखें। ऐसा लगता है कि UIRefreshControl विशेष रूप से UITableView के लिए बनाया गया है। हो सकता है कि आपको पहले से ही लागू समाधान के लिए ब्राउज़ करना होगा या इसे स्वयं बनाया होगा ... वैसे भी यह अलग-अलग प्रश्नों के लिए एक विषय है। –

0

यह ठीक दिखता है, मुझे संदेह है क्योंकि यह नियंत्रण की रचना के संबंध में कुछ दौड़ की स्थिति है। मुझे पता चला कि आलसी गुणों का उपयोग इस मामले में बहुत मदद करता है। मैं कुछ इस तरह करेंगे:

lazy var refreshControl: UIRefreshControl = { 
    let refreshControl = UIRefreshControl() 
    refreshControl.addTarget(self, action:#selector(CoreTableViewController.refresh(_:)), forControlEvents: .ValueChanged) 
    return refreshControl 
}() 

override public func viewDidLoad() { 
    super.viewDidLoad() 
    if self.enableRefresher() { 
     tableView.addSubview(refreshControl) 
    } 
    ........ 
} 

func refresh(refreshControl: UIRefreshControl) { 
    self.fetchData(true) 
    refreshControl.endRefreshing() 
} 

आप एक TableViewController उपयोग करने के लिए की जरूरत नहीं है, एक UIViewController पर्याप्त और अधिक लचीला अधिक बार नहीं है।

आशा है कि यह

7

में मदद करता है मैं ठीक पाई गई: https://stackoverflow.com/a/29088409/209200

के बजाय self.tableView.addSubview(refreshControl!), यह self.tableView.insertSubview(refreshControl!, atIndex: 0) होना चाहिए।

जो तालिका दृश्य पर प्रदर्शित होने के लिए रिफ्रेश नियंत्रण का कारण बन रहा था।

+0

यह मेरे लिए पूरी तरह से काम किया धन्यवाद! –

+1

इसके साथ भी, रीफ्रेश कंट्रोल आईओएस 11.x शुरू करने वाली तालिका के ऊपर दिखाया गया है (आईओएस 9 ठीक काम करता है) –

3

इस प्रयास करें,

ऊपर समाधान ठीक हैं लेकिन tableView.refreshControl केवल, UITableViewController के लिए उपलब्ध है आईओएस 9.x तक और iOS 10.x के बाद से UITableView में आता है।

इसे ठीक करने के बस का उपयोग करें:

स्विफ्ट 3 में लिखा -

let refreshControl = UIRefreshControl() 
refreshControl.addTarget(self, action: #selector(FeedViewController.loadNewData), for: UIControlEvents.valueChanged) 
// Fix for the RefreshControl Not appearing in background 
tableView?.addSubview(refreshControl) 
tableView.sendSubview(toBack: refreshControl) 
0

दुर्भाग्य से, ऊपर कोई भी समाधान मुझे मदद मिली है।

मेरे मामले में, तालिका दृश्य खाली होने पर तालिका दृश्य को पुनः लोड करने के बाद एक ताज़ा नियंत्रण दिखाई देता है। हो सकता है कि तालिका दृश्य में कम से कम एक पंक्ति हो, तो यह केवल ताज़ा नियंत्रण छुपाता है, मैंने इसे चेक नहीं किया है। साथ ही, जब मेरा व्यू कंट्रोलर फिर से दिखाई देता है तो यह एक वर्कअराउंड की तरह काम करता है और यह ताज़ा नियंत्रण छुपाता है।

लेकिन मुझे ताज़ा नियंत्रण को तुरंत छिपाने के लिए एक और कामकाज मिला है। एक async कॉल यहां अनिवार्य है।

tableView.reloadData() 
DispatchQueue.main.async { 
    refreshControl.endRefreshing() 
} 

मैं एक और पोस्ट में this जवाब से प्रेरित था।

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