gpt4 book ai didi

iOS (iPhone/iPad) SDK - 将 JSON 解析器与 Twitter 的 user_timeline 结合使用

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:56:05 24 4
gpt4 key购买 nike

好的,这是我的代码:

(应用程序名称)AppDelegate.h:

    #import <UIKit/UIKit.h>

@class TwitterViewContoller;

@interface <appname>AppDelegate : NSObject <UIApplicationDelegate> {
UIWindow *window;
UITabBarController *rootController;
TwitterViewContoller *viewController;
NSMutableData *responseData;
NSMutableArray *tweets;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *rootController;
@property (nonatomic, retain) IBOutlet TwitterViewContoller *viewController;
@property (nonatomic, retain) NSMutableArray *tweets;

@end

(应用名称)AppDelegate.m:

    #import "<appname>AppDelegate.h"
#import "TwitterViewContoller.h"
#import "SBJson.h"

@implementation <appname>AppDelegate

@synthesize window = _window;
@synthesize rootController;
@synthesize viewController;
@synthesize tweets;

#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
responseData = [[NSMutableData data] retain];
tweets = [NSMutableArray array];

NSURLRequest *request = [NSURLRequest requestWithURL:
[NSURL URLWithString:@"http://api.twitter.com/1/statuses/user_timeline.json?screen_name=USER_NAME_ID"]];

[[NSURLConnection alloc] initWithRequest:request delegate:self];
//[window addSubview:rootController.view];
//[window makeKeyAndVisible];
return YES;
}

#pragma mark NSURLConnection delegate methods
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {
[responseData setLength:0];
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
[responseData appendData:data];
}

- (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
[connection release];
NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
[responseData release];

//NSDictionary *results = [responseString JSONValue]; <---This...

//NSArray *allTweets = [results objectForKey:@"results"]; <--- and this was original code but it caused an exception,

NSArray *allTweets = [responseString JSONValue]; //<-- So I used this instead.
NSLog(@"THE ARRAY = %@", allTweets); //<-- THE ARRAY IS SHOWING FINE IN THE OUTPUT LOG
[viewController setTweets:allTweets];
[self.window addSubview:rootController.view];
[self.window makeKeyAndVisible];

}

- (void)dealloc {
[_window release];
[rootController release];
[viewController release];
[super dealloc];
}

@end

TwitterViewContoller.h:(是的,我知道我拼错了 - 哈哈)

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

@interface TwitterViewContoller : UIViewController {
IBOutlet UILabel *label;
NSArray *tweets;
IBOutlet UITableView *tview;
}

@property(nonatomic, retain) IBOutlet UILabel *label;
@property(nonatomic, retain) NSArray *tweets;

@end

TwitterViewContoller.m:

    #import "TwitterViewContoller.h"
#import "Tweet.h"

@implementation TwitterViewContoller

@synthesize label;
@synthesize tweets;

#pragma mark -
#pragma mark Table view data source

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


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

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
return 80;
}


// Customize the appearance of table view cells.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

static NSString *CellIdentifier = @"Cell";

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

// Configure the cell...
NSLog(@"THE ARRAY = %@", tweets); //<--ARRAY IS NULL <-- <-- <--
NSDictionary *aTweet = [tweets objectAtIndex:[indexPath row]];


cell.textLabel.text = [aTweet objectForKey:@"text"];
cell.textLabel.adjustsFontSizeToFitWidth = YES;
cell.textLabel.font = [UIFont systemFontOfSize:12];
cell.textLabel.minimumFontSize = 10;
cell.textLabel.numberOfLines = 4;
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;

cell.detailTextLabel.text = [aTweet objectForKey:@"screen_name"];

NSURL *url = [NSURL URLWithString:[aTweet objectForKey:@"profile_image_url"]];
NSData *data = [NSData dataWithContentsOfURL:url];
cell.imageView.image = [UIImage imageWithData:data];
cell.selectionStyle = UITableViewCellSelectionStyleNone;
return cell;
}


#pragma mark -
#pragma mark Table view delegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// Navigation logic may go here. Create and push another view controller.
/*
<#DetailViewController#> *detailViewController = [[<#DetailViewController#> alloc] initWithNibName:@"<#Nib name#>" bundle:nil];
// ...
// Pass the selected object to the new view controller.
[self.navigationController pushViewController:detailViewController animated:YES];
[detailViewController release];
*/
}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}

- (void)didReceiveMemoryWarning {
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];

// Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
tweets = [[NSArray alloc]init];
}

- (void)viewDidUnload {
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation {
// Return YES for supported orientations
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

- (void) dealloc {
[tweets release];
[super dealloc];
}

@end

问题是我的 UITableView 出现了,但我的推文都没有出现。我注意到 TwitterViewContoller 中的“tweets”数组(我知道我拼错了)是空的(空问题已修复)但我的 AppDelegate 中的“allTweets”不为空。有什么想法吗?

最佳答案

测试以确保在您的应用委托(delegate)中,viewController 属性不为 nil。如果您在 IB 中将它连接错误(我在您的应用程序委托(delegate)中没有看到它的任何实例化),当您调用 setTweets 时它会默默地失败。

此外,如果您的 View Controller 可见并且您重新设置了 tweets 属性,则 TableView 不会自行更新。不要合成你的 tweets 属性,而是编写你自己的 getter 和 setter,就像这样(如果你愿意,你也可以为此目的使用 KVO)

-(NSMutableArray*)tweets {
return [[tweets retain] autorelease];
}

-(void)setTweets:(NSMutableArray*)newTweets {
if(newTweets != tweets) {
[newTweets retain];
[tweets release];
tweets = newTweets;

[tView reloadData];
}
}

顺便说一句,你应该有 -tableView:numberOfRowsInSection: 返回 [tweets count] 而不是一个固定的数字,并且没有必要实现 -tableView:heightForRowAtIndexPath: 如果您的行的高度都相同——您只需在 IB 或表格 View 的代码中设置 rowHeight 属性。

更新

如果您的 View Controller 属性没有被填充,可能最简单的方法是在 -application:didFinishLaunchingWithOptions 中手动加载和添加它——我认为您当前延迟显示任何在 Web 请求完成之前的接口(interface)在概念上是有问题的。如果网络不可用会怎样?这是一些代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// ... omitting the first few lines

// let's make sure that we have the tab bar controller, at least
NSAssert(nil != self.rootViewController, @"tab bar controller not hooked up!");

self.viewController = [[[TwitterViewContoller alloc] initWithNibName:@"TwitterViewContoller" andBundle:nil] autorelease];
self.rootViewController.viewControllers = [NSArray arrayWithObject:self.viewController];

// this is now the Right Way to set the root view for your app, in iOS 4.0 and later
self.window.rootViewController = self.rootViewController;
[self.window makeKeyAndVisible];
}

当您开始一个新项目时,有很多方法会让您感到困惑。我喜欢自定义我所有的 View ,使其在开始时具有难看的背景颜色,这样我始终知道它们是否在屏幕上——使用难看的颜色有助于确保我不会忘记以后更改它们。

关于iOS (iPhone/iPad) SDK - 将 JSON 解析器与 Twitter 的 user_timeline 结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6888724/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com