2012-06-29 14 views
15

यह मेरी समस्या है: मैं इस छोटे UITableView मेरी स्टोरीबोर्ड में है: enter image description hereसेट UITableView प्रतिनिधि और डेटा स्रोत

और ये मेरे कोड है:

SmallTableViewController.h

#import <UIKit/UIKit.h> 
#import "SmallTable.h" 

@interface SmallViewController : UIViewController 

@property (weak, nonatomic) IBOutlet UITableView *myTable; 

@end 

SmallTableViewController.m

#import "SmallViewController.h" 

@interface SmallViewController() 

@end 

@implementation SmallViewController 
@synthesize myTable = _myTable; 

- (void)viewDidLoad 
{ 
    SmallTable *myTableDelegate = [[SmallTable alloc] init]; 
    [super viewDidLoad]; 
    [self.myTable setDelegate:myTableDelegate]; 
    [self.myTable setDataSource:myTableDelegate]; 

    // Do any additional setup after loading the view, typically from a nib. 
} 

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown); 
} 

@end 

अब जैसा कि आप देख सकते हैं, मैं myTableDelegate नामक एक उदाहरण सेट करना चाहता हूं जो मायटेबल के प्रतिनिधि और डेटासोर्स के रूप में है।

यह स्मॉलटेबल क्लास का स्रोत है।

SmallTable.h

#import <Foundation/Foundation.h> 

@interface SmallTable : NSObject <UITableViewDelegate , UITableViewDataSource> 

@end 

SmallTable.m

@implementation SmallTable 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 0; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    // Return the number of rows in the section. 
    return 5; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    // Configure the cell... 
    cell.textLabel.text = @"Hello there!"; 

    return cell; 
} 

#pragma mark - Table view delegate 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"Row pressed!!"); 
} 

@end 

मैं सभी UITableViewDelegate और UITableViewDataSource विधि है कि एप्लिकेशन की जरूरत को लागू किया। दृश्य दिखाई देने से पहले यह क्यों दुर्घटनाग्रस्त हो जाता है ??

धन्यवाद !!

+0

कम से कम आप त्रुटि पेस्ट किया जा सका सेट किया जाना चाहिए? – JonLOo

+0

क्या आप क्रैश लॉग भी जोड़ सकते हैं? – rishi

+0

थ्रेड में चर्चा की जांच करें - http://stackoverflow.com/questions/254354/uitableview-issue-when-using-separate-delegate- डेटासोर्स – rishi

उत्तर

15

रिकस्टर सही है। लेकिन मुझे लगता है कि आपकी viewDidLoad विधि के अंत में आपको अपनी संपत्ति के लिए strong क्वालीफायर का उपयोग करने की आवश्यकता है, जिस तरह से ऑब्जेक्ट को हटा दिया जाएगा।

@property (strong,nonatomic) SmallTable *delegate; 

// inside viewDidload 

[super viewDidLoad]; 
self.delegate = [[SmallTable alloc] init];  
[self.myTable setDelegate:myTableDelegate]; 
[self.myTable setDataSource:myTableDelegate]; 

लेकिन क्या आपकी तालिका के लिए एक अलग ऑब्जेक्ट (डेटा स्रोत और प्रतिनिधि) का उपयोग करने का कोई कारण है? आप SmallViewController को अपनी तालिका के स्रोत और प्रतिनिधि दोनों के रूप में क्यों सेट नहीं करते?

इसके अतिरिक्त आप सही तरीके से सेल नहीं बना रहे हैं। ये लाइनें कुछ भी नहीं:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

// Configure the cell... 
cell.textLabel.text = @"Hello there!"; 

dequeueReusableCellWithIdentifier बस तालिका "कैश" एक सेल कि पहले से ही बनाया गया है और कहा कि पुन: उपयोग किया जा सकता है से पुन: प्राप्त करता है (यह स्मृति की खपत से बचने के लिए), लेकिन आप किसी भी नहीं बनाया है।

आप alloc-init कहां कर रहे हैं?इस के बजाय कार्य करें:

static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if(!cell) { 
    cell = // alloc-init here 
} 
// Configure the cell... 
cell.textLabel.text = @"Hello there!"; 

इसके अलावा numberOfSectionsInTableView कहना 0 के बजाय 1 वापस जाने के लिए:

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 
4

संभवतः आप एआरसी का उपयोग कर रहे हैं? आपके myTableDelegate को स्थानीय चर में केवल viewDidLoad में संदर्भित किया गया है - एक बार यह विधि समाप्त होने के बाद, इसे हटा दिया जाता है। (प्रतिनिधि/डेटासोर्स पैटर्न में, ऑब्जेक्ट्स के अपने प्रतिनिधियों का स्वामित्व नहीं होता है, इसलिए तालिका दृश्य का संदर्भ आपके ऑब्जेक्ट पर वापस कमजोर होता है।) मैं अकेले ही दुर्घटना का कारण नहीं बनूंगा, लेकिन यह आपकी समस्या की कुंजी है।

+0

ठीक है, मैंने अभी एक नया @property (कमजोर, nonatomic) SmallTable * प्रतिनिधि बनाया है; अब एप्लिकेशन क्रैश नहीं होता है, लेकिन ... तालिका दृश्य खाली है! मैं समझ नहीं सकता क्यों ... –

1

setDelegate प्रतिनिधि को बनाए रखेगा।

और

numberOfSectionsInTableView विधि 0 के बजाय 1 वापस जाने के लिए है;

0

एक UITableView वस्तु के प्रतिनिधि UITableViewDelegate प्रोटोकॉल को अपनाने चाहिए। प्रोटोकॉल के वैकल्पिक तरीके प्रतिनिधि को चयन प्रबंधित करने, अनुभाग शीर्षलेख और पाद लेख कॉन्फ़िगर करने, विधियों को हटाने में मदद करते हैं।

enter image description here

1
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 0; 
} 

वर्गों की संख्या में एक

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

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