दिलचस्प पोस्ट
पायथन: एकाधिक सीमांकक के साथ विभाजित स्ट्रिंग कोण ब्रैकेट के बीच अंतर <> और डबल कोट्स "" जबकि C ++ में शीर्ष लेख फ़ाइलें शामिल हैं? सभी ब्राउज़रों के लिए मैं डिफ़ॉल्ट समयबाह्य सेटिंग्स कहां प्राप्त करूं? एंड्रॉइड में रनटाइम पर मौजूदा थीम को कैसे बदलना है एक कस्टम सूची में बाध्यकारी WPF कॉम्बो बॉक्स क्या स्थानीय फाइल पर एक्सएसएल ट्रांस्फ़ॉर्म करने के लिए क्रोम बनाया जा सकता है? छवि कैसे आकर्षित करें छवि पर? लेआउट बाधाओं को प्रोग्रामेटिक रूप से बनाना फाइल कैसे एक जीआईटी रेपो से दूसरे (एक क्लोन नहीं) दूसरे स्थान पर, इतिहास को संरक्षित करने के लिए एक आंतरिक वर्ग के साथ जावा कोड एक तीसरा SomeClass $ 1. वर्ग फ़ाइल क्यों बनाता है? एसक्यूएल group_concat फ़ंक्शन SQL सर्वर में Android पर HTTP के लिए प्रमाणपत्र स्वीकार करना रेंज में यादृच्छिक डबल उत्पन्न करें रूबी में तरीकों: वस्तुओं या नहीं? श्रोता प्रतिस्थापन पारंपरिक (गैर मध्यस्थ) MVC पैटर्न का पालन करने के लिए प्लेसमेंट

UITableViewCell से UITableView कैसे प्राप्त करें?

मेरे पास एक UITableViewCell जो किसी ऑब्जेक्ट से जुड़ा हुआ है और मुझे यह बताने की आवश्यकता है कि सेल दृश्यमान है या नहीं। मैंने जो अनुसंधान किया है, इसका मतलब है कि मुझे किसी भी तरह से UITableView उपयोग करना चाहिए जो इसमें शामिल है (वहां से, यह देखने के लिए कई तरीके हैं कि क्या यह दृश्यमान है)। इसलिए मैं सोच रहा हूं कि क्या UITableViewCell पास UITableViewCell के लिए एक संकेतक है या यदि सेल से एक सूचक प्राप्त करने का कोई अन्य तरीका है?

वेब के समाधान से एकत्रित समाधान "UITableViewCell से UITableView कैसे प्राप्त करें?"

आईओएस संस्करण चेक से बचने के लिए

 id view = [tableViewCellInstance superview]; while (view && [view isKindOfClass:[UITableView class]] == NO) { view = [view superview]; } UITableView *tableView = (UITableView *)view; 

IOS7 बीटा 5 UITableViewWrapperView में एक UITableViewCell का पर्यवेक्षण है इसके अलावा UITableView एक UITableView का पर्यवेक्षण है।

तो आईओएस 7 के लिए समाधान है

UITableView *tableView = (UITableView *)cell.superview.superview;

तो आईओएस 6 तक iOS के लिए समाधान है

UITableView *tableView = (UITableView *)cell.superview;

IOS7 से पहले, सेल का पर्यवेक्षण UITableView था जिसमें यह था। आईओएस 7 जीएम (ऐसा संभवत: सार्वजनिक रिलीज में भी होगा) के रूप में सेल के पर्यवेक्षण का एक यूआईटीबल वीवड्राप्परव्यू है, इसके पर्यवेक्षण में यूआईटीबल्यूव्यू है I समस्या के दो समाधान हैं

समाधान # 1: एक UITableViewCell श्रेणी बनाएँ

 @implementation UITableViewCell (RelatedTable) - (UITableView *)relatedTable { if ([self.superview isKindOfClass:[UITableView class]]) return (UITableView *)self.superview; else if ([self.superview.superview isKindOfClass:[UITableView class]]) return (UITableView *)self.superview.superview; else { NSAssert(NO, @"UITableView shall always be found."); return nil; } } @end 

cell.superview का उपयोग करने के लिए यह एक अच्छी ड्रॉप-इन प्रतिस्थापन है। cell.superview , आपके मौजूदा कोड को cell.superview करना आसान बनाता है – बस [cell relatedTable] खोज और प्रतिस्थापित करें, और यह सुनिश्चित करने के लिए एक जोर दें कि यदि दृश्य पदानुक्रम में परिवर्तन या बदल जाता है भविष्य में यह आपके परीक्षणों में तत्काल दिखाई देगा।

समाधान # 2: UITableView लिए एक कमजोर UITableView संदर्भ जोड़ें

 @interface SOUITableViewCell @property (weak, nonatomic) UITableView *tableView; @end 

यह एक बेहतर डिजाइन है, हालांकि मौजूदा परियोजनाओं में इसका उपयोग करने के लिए थोड़ा अधिक कोड रिफैक्टरिंग की आवश्यकता होगी। अपने टेबल दृश्य में tableView:cellForRowAtIndexPath अपने सेल वर्ग के रूप में SOUITableViewCell का उपयोग करें या सुनिश्चित करें कि आपका कस्टम सेल क्लास SOUITableViewCell से subclassed है और SOUITableViewCell को सेल की SOUITableViewCell असाइन करें। सेल के अंदर आप तब self.tableView का उपयोग करके युक्त तालिका self.tableView का उल्लेख कर सकते हैं।

स्विफ्ट 3 एक्सटेंशन

रिकर्सिवली

 extension UIView { func parentView<T: UIView>(of type: T.Type) -> T? { guard let view = self.superview else { return nil } return (view as? T) ?? view.parentView(of: T.self) } } extension UITableViewCell { var tableView: UITableView? { return self.parentView(of: UITableView.self) } } 

लूप का उपयोग करना

 extension UITableViewCell { var tableView: UITableView? { var view = self.superview while (view != nil && view!.isKind(of: UITableView.self) == false) { view = view!.superview } return view as? UITableView } } 

यदि यह दिखाई दे रहा है तो उसके पास एक पर्यवेक्षण है। और … आश्चर्य … पर्यवेक्षण एक UITableView ऑब्जेक्ट है

हालांकि, एक पर्यवेक्षण स्क्रीन पर रहने के लिए कोई गारंटी नहीं है। लेकिन UITableView यह निर्धारित करने के तरीकों प्रदान करता है कि कौन से कक्ष दृश्यमान हैं

और नहीं, कोई कक्ष से तालिका तक कोई समर्पित संदर्भ नहीं है लेकिन जब आप UITableViewCell subclass आप एक परिचय और सृजन पर सेट कर सकते हैं। (मैंने उपविभागीय पदानुक्रम के बारे में सोचा था इससे पहले कि मैंने खुद को बहुत कुछ किया।)

आईओएस 7 के लिए अद्यतन: ऐप्पल ने यहां पर सबव्यू पदानुक्रम को बदल दिया है हमेशा की तरह जब ऐसी चीज़ों के साथ काम करना होता है जो दस्तावेज़ीकृत नहीं होते हैं, तो हमेशा एक जोखिम होता है कि चीजें बदलती हैं। जब तक कि एक UITableView ऑब्जेक्ट अंत में पाया नहीं जाता है, तब तक यह दृश्य पदानुक्रम "क्रॉल" करने के लिए बहुत दूर है।

मैंने अपनी माता-पिता तालिका प्राप्त करने के लिए UITableViewCell पर एक श्रेणी बनाई:

 @implementation UITableViewCell (ParentTableView) - (UITableView *)parentTableView { UITableView *tableView = nil; UIView *view = self; while(view != nil) { if([view isKindOfClass:[UITableView class]]) { tableView = (UITableView *)view; break; } view = [view superview]; } return tableView; } @end 

श्रेष्ठ,

सुपर व्यू कॉल करके या रिस्पॉन्सर श्रृंखला के माध्यम से जो कुछ भी आप कर सकते हैं, वह बहुत नाजुक होगा। ऐसा करने का सबसे अच्छा तरीका है, अगर कोशिका कुछ जानना चाहती है, सेल को किसी वस्तु को पास करना होता है जो सेल द्वारा पूछे जाने वाले प्रश्न का उत्तर देने वाली कुछ विधि का जवाब देता है, और नियंत्रक को यह निर्धारित करने के तर्क को लागू करना है कि क्या जवाब देना है (आपके प्रश्न से मुझे लगता है कि कक्ष जानना चाहता है कि कुछ दिखाई दे रहा है या नहीं)

स्विफ्ट 2.2 समाधान।

UIView के लिए एक एक्सटेंशन जो एक विशिष्ट प्रकार के साथ एक दृश्य के लिए बार-बार खोज करता है

 import UIKit extension UIView { func lookForSuperviewOfType<T: UIView>(type: T.Type) -> T? { guard let view = self.superview as? T else { return self.superview?.lookForSuperviewOfType(type) } return view } } 

या अधिक कॉम्पैक्ट (कबीरबेराई के लिए धन्यवाद):

 import UIKit extension UIView { func lookForSuperviewOfType<T: UIView>(type: T.Type) -> T? { return superview as? T ?? superview?.superviewOfType(type) } } 

अपने सेल में आप इसे कॉल करते हैं:

 let tableView = self.lookForSuperviewOfType(UITableView) // Here we go 

ध्यान रखें कि UITableViewCell को UIFableView पर केवल सेलफोररौएटीएंडएक्सएपएप निष्पादन के बाद जोड़ा जाता है।

यहाँ ऊपर दिए गए उत्तरों पर आधारित स्विफ्ट संस्करण है बाद में उपयोग के लिए मैंने ExtendedCell कॉल में सामान्यीकृत किया है I

 import Foundation import UIKit class ExtendedCell: UITableViewCell { weak var _tableView: UITableView! func rowIndex() -> Int { if _tableView == nil { _tableView = tableView() } return _tableView.indexPathForSelectedRow!.row } func tableView() -> UITableView! { if _tableView != nil { return _tableView } var view = self.superview while view != nil && !(view?.isKindOfClass(UITableView))! { view = view?.superview } self._tableView = view as! UITableView return _tableView } } 

उममीद है कि इससे मदद मिलेगी 🙂

मैंने इस समाधान को गब के सुझाव पर आधारित किया है कि यूआईटीबल वी वीपर ऑब्जेक्ट IOS7 beta5 में UITableViewCell ऑब्जेक्ट के पर्यवेक्षण है।

उप-वर्ग UITableviewCell :

 - (UITableView *)superTableView { return (UITableView *)[self findTableView:self]; } - (UIView *)findTableView:(UIView *)view { if (view.superview && [view.superview isKindOfClass:[UITableView class]]) { return view.superview; } return [self findTableView:view.superview]; } 

मैंने उधार लिया और ऊपर दिए गए उत्तर से थोड़ा सा संशोधित किया और निम्नलिखित स्निपेट के साथ आया।

 - (id)recursivelyFindSuperViewWithClass:(Class)clazz fromView:(id)containedView { id containingView = [containedView superview]; while (containingView && ![containingView isKindOfClass:[clazz class]]) { containingView = [containingView superview]; } return containingView; } 

क्लास में पासिंग कुछ अन्य अवसरों में यूटाबल वीव के अलावा ट्रैवर्सिंग और दृश्य प्राप्त करने के लिए लचीलापन प्रदान करता है।

इस समस्या का मेरा समाधान कुछ अन्य समाधानों के समान है, लेकिन इसके लिए एक सुरुचिपूर्ण लूप का उपयोग करता है और यह छोटा है। यह भविष्य-प्रमाण भी होना चाहिए:

 - (UITableView *)tableView { UIView *view; for (view = self.superview; ![view isKindOfClass:UITableView.class]; view = view.superview); return (UITableView *)view; } 
 UITableView *tv = (UITableView *) self.superview.superview; BuyListController *vc = (BuyListController *) tv.dataSource; 

पर्यवेक्षण के बजाय, ["UItableViewvariable" visibleCells] उपयोग करने का प्रयास करें

मैंने उस प्रकोष्ठ में लूप को उन कोशिकाओं के माध्यम से प्रयोग किया था जो ऐप ने देखा और यह काम किया।

 for (UITableView *v in [orderItemTableView visibleCells])//visibleCell is the fix. { @try{ [orderItemTableView reloadData]; if ([v isKindOfClass:[UIView class]]) { ReviewOrderTableViewCell *cell = (ReviewOrderTableViewCell *)v; if (([[cell deleteRecord] intValue] == 1) || ([[[cell editQuantityText] text] intValue] == 0)) //code here } } } 

एक जादू की तरह काम करता है।

न्यूनतम परीक्षण किया गया लेकिन यह गैर-सामान्य स्विफ्ट 3 उदाहरण काम करने लगता है:

 extension UITableViewCell { func tableView() -> UITableView? { var currentView: UIView = self while let superView = currentView.superview { if superView is UITableView { return (superView as! UITableView) } currentView = superView } return nil } } 

यह कोड `UITableView *tblView=[cell superview]; आपको यूआई टेलिविज़न विज़ुअल का एक उदाहरण देगा जिसमें टैब व्यू सेल शामिल होगा

मैं सुझाव देता हूं कि आप पेरेंट UITableView को खोजने के लिए इस तरह के दृश्य पदानुक्रम को पार करते हैं:

 - (UITableView *) findParentTableView:(UITableViewCell *) cell { UIView *view = cell; while ( view && ![view isKindOfClass:[UITableView class]] ) { #ifdef DEBUG NSLog( @"%@", [[view class ] description] ); #endif view = [view superview]; } return ( (UITableView *) view ); } 

अन्यथा आपका कोड तब टूट जाएगा जब एप्पल दृश्य पदानुक्रम को फिर से बदल देगा

एक और जवाब है जो पदानुक्रम में फिर से दोहराता है।

 UITableViewCell Internal View Hierarchy Change in iOS 7 Using iOS 6.1 SDK <UITableViewCell> | <UITableViewCellContentView> | | <UILabel> Using iOS 7 SDK <UITableViewCell> | <UITableViewCellScrollView> | | <UIButton> | | | <UIImageView> | | <UITableViewCellContentView> | | | <UILabel> The new private UITableViewCellScrollView class is a subclass of UIScrollView and is what allows this interaction: ![enter image description here][1] [1]: http://img.hiwab.com/iphone/C2uJa.gif 

http://www.curiousfind.com/blog/646 धन्यवाद

आप इसे कोड की एक पंक्ति से प्राप्त कर सकते हैं।

 UITableView *tableView = (UITableView *)[[cell superview] superview]; 
 extension UIView { func parentTableView() -> UITableView? { var viewOrNil: UIView? = self while let view = viewOrNil { if let tableView = view as? UITableView { return tableView } viewOrNil = view.superview } return nil } }