2011-08-22 5 views
13

पर प्रोग्रामिंग के लिए UITableView जोड़ना मैं अपने Nav नियंत्रक के पदानुक्रमों में से एक में UIViewController लोड कर रहा हूं, जिसमें कुछ टेक्स्ट और कुछ छवियां होंगी। नीचे, मैं एक विस्तारणीय और ढहने योग्य टेबलव्यू बनाना चाहता हूं।UIViewController

सबसे पहले, क्या यह विचार संभव है? यदि ऐसा है, तो मैं इसे कैसे जोड़ूं और मैं डेटा स्रोत कहां रखूं और विधियों को प्रतिनिधि दूं?

क्या मैं केवल TableViewController का एक अलग सबक्लास बना सकता हूं और फिर इसे मेरे व्यू कंट्रोलर में सबव्यूव के रूप में जोड़ सकता हूं?

+0

आप व्यू कंट्रोलर को सबव्यूव के रूप में कुछ भी नहीं जोड़ सकते हैं, क्योंकि व्यू कंट्रोलर दृश्य नहीं है, और केवल विचारों में सबव्यूव हैं। –

उत्तर

20

हां, आप एक UITableView बना सकते हैं जिसका प्रतिनिधि, डेटासोर्स, और मूल दृश्य आवश्यक रूप से UITableViewController नहीं है। चूंकि UITableView एक UIView है, इसलिए आप इसे किसी अन्य UIView के सबव्यूव के रूप में जोड़ सकते हैं। जब तक आप आवश्यक प्रोटोकॉल विधियों को लागू करते हैं, तब तक कोई भी NSObject प्रतिनिधि या डेटासोर्स हो सकता है।

@interface MyViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

असल में, मेरे अनुभव में, बहुत से लोग UITableViewControllers का भी उपयोग नहीं करते हैं। पिछली बार जब आप अपनी टेबल दृश्य को पूरी उपयोग करने योग्य जगह लेना चाहते थे? आम तौर पर, मैं एक सादे पुराने UIViewController बना देता हूं और अन्य दृश्यों के अलावा, इसके दृश्य के सबव्यूव के रूप में एक UITableView जोड़ता हूं।

+0

हे @ कमांड, आईओएस विकास के लिए नया है और इस पर अन्य ऑब्जेक्ट्स के साथ uiviewcontroller में एक यूट्यूबव्यू डालने के तरीके को ठीक से कार्यान्वित करने के तरीके के रूप में देख रहे हैं। वैसे भी, मैं इस पर ठोकर खा रहा था और सोच रहा था कि क्या आप कुछ ट्यूटोरियल/स्रोत कोड के बारे में जान सकते हैं, तो मैं देख सकता हूं ताकि मैं समझ सकूं कि यह कैसे काम करता है? धन्यवाद! – gdubs

11

यह बहुत आसान है अपने viewDidLoad विधि की तरह कुछ में:

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds]; 
[self.view addSubview:tableView]; 
4

बस याद रखें कि एक UITableViewController केवल tableview नियंत्रक के दृष्टिकोण के रूप में सेट के साथ UIViewController का एक उपवर्ग है।

तो हाँ निश्चित रूप से संभव है और जब आप एक टेबलव्यू चाहते हैं लेकिन अन्य कस्टम UI तत्व भी हैं जो आपको UITableViewController का उपयोग करने से रोकते हैं।

मैं सामान्य रूप से इसे अपने प्रारंभ नियंत्रक विधि या दृश्यडिडलोड विधि में अपने दृश्य नियंत्रक के दृश्य में जोड़ना चाहता हूं। यह इस बात पर निर्भर करेगा कि आप एनआईबी से या पूरी तरह से प्रोग्रामेटिक रूप से अपने विचार बना रहे हैं या नहीं।

महत्वपूर्ण व्यक्ति के मामले में:

- (id)initWithNibName:(NSString*)nibName bundle:(NSBundle*)bundleName 
{ 
    if ((self = [super initWitNibName:nibName bundle:bundleName])) 
    { 
     self.theTableView = [[UITableView alloc] initWithFrame:CGRectZero style:UITableViewWhateverStyleYouWantHere]; 
     theTableView.dataSource = self, theTableView.delegate = self; 
     [self.view addSubview:theTableView]; 
     [theTableView release]; 
    } 
} 

और फिर आप अपने viewDidLoad विधि में अपने tableview के फ्रेम सेट कर सकते हैं।

मैं व्यक्तिगत रूप से इंटरफ़ेस बिल्डर में पूरी चीज करना पसंद करता हूं क्योंकि आप बनाए रखने के लिए कम कोड के साथ एक ही परिणाम प्राप्त करेंगे।

+0

मुझे उत्सुकता है कि आईबी का उपयोग करने से परिणामस्वरूप "रास्ता कम कोड" होगा। इसे कोड में पूरी तरह से करने के लिए, 'initWithNibName: बंडल:' को एक साधारण 'init' में बदल दिया जाएगा - लेकिन क्या कुछ और बदल जाएगा? –

+1

मुझे लगता है कि 'डेटासोर्स' होना चाहिए 'डेटासोर्स' –

15
/************************************************/ 
/************* MyCustomController.m *************/ 
/************************************************/ 

@interface MyCustomController() <UITableViewDataSource, UITableViewDelegate> 
@property (nonatomic, strong) UITableView *tableView; 
@end 

@implementation MyCustomController 

- (id)initWithNibName:(NSString*)nibName bundle:(NSString*)bundleName 
{ 
    self = [super initWitNibName:nibName bundle:bundleName]; 
    if (self) 
    { 
     self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain]; 
     tableView.datasource = self; 
     tableView.delegate = self; 
     [self.view addSubview:self.tableView]; 
    } 

    return self; 
} 

#pragma mark - UITableViewDataSource Methods 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // return number of rows 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // return cell 
} 

#pragma mark - UITableViewDelegate Methods 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // handle table view selection 
} 

@end 
2

तुम मुझे पसंद कर रहे हैं और पहले से ही एक UITableViewController बनाया था और फिर एहसास है कि आप उस पर इतना काम किया है कि फिर से लिखकर यह एक दर्द हो सकता है, तो आप UITableViewController जोड़ने के लिए निम्नलिखित सिर्फ कर सकते हैं एक सबव्यू के रूप में UIViewController के लिए।

UITableViewController* tableViewController = [[UITableViewController alloc] init]; 
[self.view addSubview:tableViewController.tableView]; 

उपरोक्त सभी अन्य उत्तर महान काम करता है। मुझे लगता है कि मैं उन लोगों के लिए इसमें शामिल हूं जिनके पास UITableViewController का भारी निवेश किया गया है और ऐसा लगता है कि रिफैक्टरिंग दर्द होगा।

+0

मैं इस तरह से भी पसंद करूंगा - टेबल कंट्रोलर उस तरह से अच्छी तरह से व्यू कंट्रोलर से अलग है। – Tommz

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

  • कोई संबंधित समस्या नहीं^_^