2012-06-15 110 views
0

我有一个子视图,在其中我构建了一个UITableview,我已经将委托和数据源设置为子视图,但由于某种原因,表方法没有被调用......有人可以看看我的代码,看看我做错了什么?由于UITableView - 方法没有被调用

.h文件中

@interface TwitterController : UIView <UITableViewDelegate, UITableViewDataSource> { 

UIButton* btnCloseView; 
UITableView* tblTweets; 
UIImageView* imgTwitterIcon; 

ColorController* colorManager; 

NSMutableArray* tweetsArray; 
NSMutableArray* tableData; 

NSString* twitterID; 

} 

@property (nonatomic, retain) NSString* twitterID; 

- (NSMutableArray*) getTweets; 

- (void) sendNotification : (id) sender; 

@end 

.m文件

#import "TwitterController.h" 

@implementation TwitterController 

@synthesize twitterID; 

- (id)initWithFrame:(CGRect)frame 
{ 
self = [super initWithFrame:frame]; 
if (self) { 

    colorManager = [ColorController new]; 

} 
return self; 
} 


/*- (void)drawRect:(CGRect)rect { 



}*/ 

- (void)layoutSubviews { 

imgTwitterIcon = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"imgTwitterBird"]]; 
CGRect twitterIconFrame = [imgTwitterIcon frame]; 
twitterIconFrame.origin.x = 50.0; 
twitterIconFrame.origin.y = 20.0; 

tblTweets = [[UITableView alloc] initWithFrame:CGRectMake(50.0, 25.0, 220.0, 500.0)]; 
tblTweets.separatorStyle = UITableViewCellSeparatorStyleSingleLine; 
tblTweets.separatorColor = [colorManager setColor:176.0:196.0:222.0]; 
tblTweets.layer.borderWidth = 1.0; 
tblTweets.rowHeight = 20.0; 
tblTweets.scrollEnabled = YES; 
tblTweets.delegate = self; 
tblTweets.dataSource = self; 

tableData = [self getTweets]; 

UIImage* imgCloseButton = [UIImage imageNamed:@"btnCloseWindow.png"]; 
CGSize imageSize = imgCloseButton.size; 
btnCloseView = [[UIButton alloc] initWithFrame: CGRectMake(220.0, 550.0, imageSize.width, imageSize.height)]; 
[btnCloseView setImage:[UIImage imageNamed:@"btnCloseWindow.png"] forState:UIControlStateNormal]; 
[btnCloseView addTarget:self action:@selector(sendNotification:) forControlEvents:UIControlEventTouchUpInside]; 


[self addSubview:tblTweets]; 
[self addSubview:imgTwitterIcon]; 
[self addSubview:btnCloseView]; 
} 

- (NSMutableArray*) getTweets { 

//array to hold tweets 
tweetsArray = [[NSMutableArray alloc] init]; 

twitterID = @"Pruit_Igoe"; 

///set up a NSURL to the twitter API 
NSURL* twitterAPI = [NSURL URLWithString:[NSString stringWithFormat:@"https://api.twitter.com/1/statuses/user_timeline.json?include_entities=true&include_rts=true&screen_name=%@&count=10", twitterID]]; 

//get last 10 tweets (max is 20) 
TWRequest *twitterRequest = [[TWRequest alloc] initWithURL:twitterAPI 
      parameters:nil requestMethod:TWRequestMethodGET]; 

// Notice this is a block, it is the handler to process the response 
[twitterRequest performRequestWithHandler:^(NSData *responseData, NSHTTPURLResponse *urlResponse, NSError *error) { 
    if ([urlResponse statusCode] == 200) { 

     // The response from Twitter is in JSON format 
     // Move the response into a dictionary and print 
     NSError *error;   
     NSDictionary *tweetsDict = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; 

     for(NSDictionary* thisTweetDict in tweetsDict) { 

      [tweetsArray addObject:[thisTweetDict objectForKey:@"text"]]; 
     } 

    } 
    else 
     NSLog(@"Twitter error, HTTP response: %i", [urlResponse statusCode]); 
}]; 

return tweetsArray; 


} 

#pragma mark Table Management 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
return [tableData count]; 
NSLog(@"%i", [tableData count]); //does not log! 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
return [tableData count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

static NSString *CellIdentifier = @"tableCell"; 

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 

cell.textLabel.textColor = [UIColor colorWithRed:66.0/255.0 green:66.0/255.0 blue:66.0/255.0 alpha:1]; 
cell.textLabel.font = [UIFont fontWithName:@"Helvetica-Bold" size: 13.0]; 
cell.textLabel.text = [tweetsArray objectAtIndex:indexPath.row]; 
CGRect cellFrame = [cell frame]; 
cellFrame.size.height = 25.0; 

return cell; 

}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

NSString* thisTweet = [tableData objectAtIndex:indexPath.row]; 
} 

#pragma mark Close Window 

- (void) sendNotification : (id) sender { 

NSMutableDictionary* userData = [[NSMutableDictionary alloc] init]; 

[userData setObject:@"closeTwitter" forKey:@"theEvent"]; 

[[NSNotificationCenter defaultCenter] postNotificationName:@"theMessenger" object:self userInfo: userData]; 

} 

@end 
+0

你有分配和初始化你的tblTweets? –

+0

他确实 - 但在'layoutSubviews' –

回答

0

你应该做所有的初始化(tblTweets例如)在initWithFrame:

layoutSubviews是布置子视图的必要条件。

事实上,如果您将所有代码fromLayoutSubviews移动到initWithFrame:,您的代码将(应该)工作。然后,您可以将部分代码(布局部分)移回。

编辑:当您移动初始化代码,你可能还需要添加[tblTweets reloadData];之后tableData = [self getTweets];

+0

这是出于性能原因或代码组织的最佳做法?我会在init中还是在layoutSubviews中添加UITableView?即 - (void)layoutSubviews {[self addSubview tblTweets]; }? – PruitIgoe

+0

关于表数据未加载的原因的任何线索? :) – PruitIgoe

+0

'layoutSubviews'可能会在应用程序执行期间被调用更多时间 - 这是主要原因。我会检查加载。 –

1

我想你是不是分配和初始化tableData。写tableData = [[NSMutableArray alloc] init];- (id)initWithFrame:(CGRect)frame方法或- (void)layoutSubviews方法。去尝试一下。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
NSLog(@"%i", [tableData count]); 
return [tableData count]; 
//NSLog(@"%i", [tableData count]); //does not log! 
} 

如果输出为零,tableData数组为空。检查它tableData阵列

+0

你很好,我错过了那一个。 –

+0

如果tweetArray被分配/ init并从getTweets返回我必须alloc/init tableData吗?我以为我不需要。我将alloc/init添加到我的代码中,但没有任何更改。 – PruitIgoe

+0

我编辑了我的代码。 –

相关问题