2011-08-05 20 views
17

मुझे UITableView मिल गया है कि मैं शीर्ष पर एक 44px सबव्यू देखना चाहता हूं। मैंने tableViewHeader की कोशिश की, लेकिन वह शेष तालिका के साथ स्क्रॉल करता है।UITableview के लिए फिक्स्ड हेडर?

मैंने खोज करने की कोशिश की और कई लोगों को यह कहते हुए पाया कि मुझे UIView पर्यवेक्षण जोड़ने की आवश्यकता है और फिर मेरे हेडर और UITableView को इसमें जोड़ें। हालांकि मुझे यह कैसे करना है इस पर एक उदाहरण नहीं मिल रहा है। मैंने एक नया UIView सबक्लास बनाने और आईबी में सबव्यूज़ डालने का प्रयास किया, लेकिन मैं तालिका नियंत्रक को डब्ल्यू/यूआईटीबल को जोड़ने में परेशानी में भाग गया (क्योंकि मुझे आईबी के बारे में पर्याप्त जानकारी नहीं है)।

मैं कैसे XIBs के साथ इस कर सकते हैं? क्या कोई उदाहरण प्रदान कर सकता है?

आपके द्वारा प्रदान की जाने वाली किसी भी मदद के लिए धन्यवाद।

+0

[संभावित अनुभाग शीर्षलेखों के साथ UITableView] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/17582818/uitableview-with-fixed-section-headers) –

उत्तर

34

आखिरकार पोस्टिंग के बाद मुझे यह पता चला। आंकड़े।

  1. मौजूदा UITableViewController और उसके XIB हटाएँ: :)

    यहाँ मैं क्या किया, में मामला दूसरों एक ही समस्या में पड़ रहा है। वे जंक हैं। जब आप करते हैं तो वास्तव में पागल हो जाओ।

  2. एक XIB

  3. ओपन आईबी में XIB के साथ एक नया UIViewController उपवर्ग करें और अपने हैडर सामान जोड़ सकते हैं और UIView

  4. UITableView के लिए आईबी के आउटलेट में करने के लिए एक UITableView आप प्रतिनिधि कनेक्ट सुनिश्चित करें और आपके फ़ाइल स्वामी को डेटासोर्स

  5. अपने व्यू कंट्रोलर के लिए हेडर में, इन प्रोटोकॉल को लागू करने के लिए <UITableViewDelegate, UITableViewDataSource> जोड़ने के लिए सुनिश्चित करें

  6. सभी नियमित UITableView प्रतिनिधि और डेटा स्रोत के तरीकों आप जानते हैं और प्यार को लागू करें, लेकिन इसके बजाय रास्ते से अपने UIViewController में आप के बाद यह बातें काम करना चाहिए के माध्यम से UITableViewController

यह कर के लिए इस्तेमाल कर रहे हैं।

+2

यह स्वीकार्य उत्तर होना चाहिए। वर्तमान में स्वीकृत उत्तर जैसे मौजूदा तरीकों को ओवरराइड करना अंतिम उपाय होना चाहिए। –

+11

हालांकि, अगर आपको अन्य कारणों से UITableViewController होने की आवश्यकता है तो यह समस्या का समाधान नहीं करता है। – Gujamin

+0

@PauldeLange क्या आपका मतलब स्टीव से जवाब है? मौजूदा तरीकों को ओवरराइड करने में क्या गलत है? – Dejell

9

समस्या यह है कि, UITableViewController की दृश्य संपत्ति तालिका दृश्य संपत्ति के समान ही है। मुझे एक ही समस्या थी, टेबल के ऊपर कुछ निश्चित सामग्री डालना चाहते थे। मैं बेस क्लास को बदलना नहीं चाहता था, क्योंकि यह बहुत सारी कार्यक्षमता प्रदान करता है जिसे मैं खोना या बाधित नहीं करना चाहता था।

फिक्स वास्तव में आसान है। चाल कस्टम सेट बनाने और self.tableView संपत्ति के लिए प्राप्त करने के लिए है। फिर, loadView में, आप दृश्य को एक नए UIView के साथ प्रतिस्थापित करते हैं और तालिका को इसमें देखें। फिर आप तालिका दृश्य के चारों ओर सबव्यूज़ जोड़ने के लिए स्वतंत्र हैं। यहाँ यह कैसे किया है:

हेडर में:

@interface CustomTableViewController : UITableViewController 
{ 
    UITableView *tableView; 
} 

मीटर में:

- (UITableView*)tableView 
{ 
    return tableView; 
} 

- (void)setTableView:(UITableView *)newTableView 
{ 
    if (newTableView != tableView) 
    { 
     [tableView release]; 
     tableView = [newTableView retain]; 
    }   
} 

- (void)loadView { 
    [super loadView]; 
    //save current tableview, then replace view with a regular uiview 
    self.tableView = (UITableView*)self.view; 
    UIView *replacementView = [[UIView alloc] initWithFrame:self.tableView.frame]; 
    self.view = replacementView; 
    [replacementView release]; 
    [self.view addSubview:self.tableView];  

    //code below adds some custom stuff above the table 
    UIView *customHeader = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 20)]; 
    customHeader.backgroundColor = [UIColor redColor]; 
    [self.view addSubview:customHeader]; 
    [customHeader release]; 

    self.tableView.frame = CGRectMake(0, customHeader.frame.size.height, self.view.frame.size.width, self.view.frame.size.height - customHeader.frame.size.height); 
} 

का आनंद लें!

+1

मौजूदा विधियों को ओवरराइट करने के बारे में आप क्या कहते हैं = क्या आप इसकी अनुशंसा करते हैं? – Dejell

+1

और यह कोड एआरसी – Dejell

+1

के साथ काम नहीं करता है, भले ही यह काम करता है, यह तकनीकी रूप से गलत है, क्योंकि दस्तावेज़ स्पष्ट रूप से लोडव्यू में 'सुपर' को कॉल नहीं करते हैं (जिसे इस समाधान के लिए इस समाधान के लिए किया जाना चाहिए)। – Anthony

1

यूआई के भाग के रूप एम्बेड करने के लिए UITableViewController एक और UIViewController में 'कंटेनर देखें' तत्व (वस्तु पुस्तकालय से इंटरफ़ेस बिल्डर में एक चुनना (जहां अन्य सभी दृश्यों कर रहे हैं)) के साथ यह संभव है एक विकल्प के रूप में ।

इस तरह आप (स्थिति के संदर्भ में) साधारण दृश्य की तरह UITableViewController का उपयोग कर सकते हैं और मौजूदा तालिका दृश्य कोड overwritting के बिना किसी भी लेआउट आप की जरूरत रचना

संपादित करें:

आगे मेरा उत्तर विस्तार करने के लिए, यहाँ हैं

  1. ओपन आप इंटरफ़ेस बिल्डर में
  2. ड्रैग एंड ड्रॉप सेंट के लिए एक नया ViewController तत्व storyboar: चरणों में वर्णित दृष्टिकोण पूरा करने के लिए एक नया नियंत्रक जोड़ने के लिए Object Library से ऑरबोर्ड।
  3. एक बच्चे को देखने के रूप में, वस्तु लाइब्रेरी से ड्रैग एंड ड्रॉप Container View और ViewController

  4. Container View के अंदर कहीं भी यह जगह एक कनेक्शन के रूप अन्य दृश्य नियंत्रक और "एम्बेडेड" segue पैदा करता है। में "एम्बेड करें" का चयन करें - यह आवश्यक view controller साथ Container View कनेक्ट करने के लिए इस viewcontroller नष्ट करने के लिए बचाने के लिए और (सवाल यह UITableViewController है के अनुसार)

  5. UITableViewController साथ Container View कनेक्ट करने के लिए सिर्फ container view और नियंत्रण + UITableViewController करने के लिए ड्रैग चयन है पॉपअप मेनू

अब नियंत्रक कंटेनर की स्थिति और सीमाओं के संबंध में Container View के अंदर प्रदर्शित होगा।

यह embeeded दृश्य नियंत्रक के लिए एक लिंक प्राप्त करना संभव है - प्रणाली को सक्रिय कर देगा मेजबान ViewController (ऊपर चरण 1 पर बनाया) की "prepareForSegue" विधि और नियंत्रक segue.destinationViewController संपत्ति में है - एक अनुकूलित कर सकते हैं जैसी ज़रूरत। बस इंटरफ़ेस बिल्डर में "एम्बेडेड" सेग्यू में पहचानकर्ता सेट करना सुनिश्चित करें - यह वही प्रक्रिया है जो किसी भी अन्य सीगू की तरह ही है।

+0

क्या आप अपने उत्तर में विस्तार से वर्णन कर सकते हैं कि आपने जो कहा है उसे कैसे करें? –

+0

@NiteshBorad कृपया मेरे अपडेट किए गए उत्तर की जांच करें - कृपया मुझे बताएं कि क्या यह पर्याप्त –

+0

प्रक्रिया को कवर करता है, मैंने आपके उत्तर अपडेट से पहले ऐसा किया है। हालांकि, त्वरित प्रतिक्रिया के लिए धन्यवाद। अब आपका जवाब सही लगता है। यह काम करता हैं। –

1

एक दृश्य नियंत्रक के साथ TableViewController को बदलें, इसके अंदर आप निश्चित सामग्री को रखने के लिए निश्चित ऊंचाई के साथ एक UIView जोड़ें, और नीचे UITableView जोड़ें।

अपने tableview करने के लिए एक आउटलेट बनाएं

@IBOutlet weak var tableView: UITableView! 

आप सभी funcs आप पहले से ही उदाहरण

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return data.count 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let c = tableView.dequeueReusableCellWithIdentifier(cellId) as UITableViewCell! 
    c.textLabel?.text = "A title" 
    c.detailTextLabel?.text = "A subtitle" 
    return c 
} 

के लिए ओवरराइड शब्द को हटाने है पुन: उपयोग कर सकते हैं यदि आप स्वत: ताज़ा नियंत्रण जोड़ने के लिए इस सवाल का जवाब देखें इसकी आवश्यकता है Pull to refresh UITableView without UITableViewController

+3

उत्तर में सुधार करने में मदद करता है यदि आपको लगता है कि यह प्रश्न डुप्लिकेट है, तो इसे इस तरह चिह्नित किया जाना चाहिए। उत्तर के रूप में अन्य StackOverflow पदों के लिंक पोस्ट न करें। – JAL

+0

प्रश्न डुप्लीकेट नहीं किया गया है, ऊपर दिए गए किसी ने कहा है कि स्वीकार किए गए उत्तर को लागू नहीं करने के कारणों में से एक यह है क्योंकि वे स्वचालित रीफ्रेश नियंत्रण का उपयोग नहीं कर सकते हैं, मैं इसे स्वीकृत उत्तर के साथ उपयोग करने का एक तरीका दिखा रहा हूं। अगर मैं स्टैक ओवरफ्लो ऐसा करने की अनुमति देता है तो मैं स्वीकार्य उत्तर में एक टिप्पणी करता, लेकिन मैं नहीं कर सकता क्योंकि यह प्रतिष्ठा के 50 अंक मांगता है। – iyepes

0

स्टोरीबोर्ड या xib में कस्टम UIView को परिभाषित करें, दृश्य नियंत्रक में उस UIView के लिए एक IBOutlet संदर्भ है। -(void)viewWillAppear:(BOOL)animated विधि [self.tableView.superview addSubview:filterHeaderView]; पर लिखें, यहां filterHeaderView मेरे हेडर व्यू के लिए आईबीओलेट संदर्भ है जिसे मैं अपने टेबलव्यू में निश्चित शीर्षलेख के रूप में जोड़ना चाहता हूं।

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