Objective c 如何通过NSMutableArray在UITableView上显示数据?
我尝试使用Objective c 如何通过NSMutableArray在UITableView上显示数据?,objective-c,uitableview,nsmutablearray,Objective C,Uitableview,Nsmutablearray,我尝试使用NSMutableArray对象作为数据容器来存储数据 @property (retain, nonatomic) NSMutableArray* allTweets; 我从网络中获取JSON并将其解析为allTweets。但是,我无法使用重新加载数据 [self.tableView重载数据]我在main.m 我尝试在属性中使用strong。它又崩溃了。当我使用弱时,不会再发生崩溃。但是所有的推特总是零 - (void)viewDidLoad { [s
NSMutableArray
对象作为数据容器来存储数据
@property (retain, nonatomic) NSMutableArray* allTweets;
我从网络中获取JSON并将其解析为allTweets
。但是,我无法使用重新加载数据
[self.tableView重载数据]代码>我在main.m
我尝试在属性中使用strong
。它又崩溃了。当我使用弱
时,不会再发生崩溃。但是所有的推特总是零
- (void)viewDidLoad
{
[super viewDidLoad];
//* other codes *//
self.allTweets = [[NSMutableArray alloc]initWithCapacity:50];
[self getTimeline:nil];
}
-(void) parseTweetJSON:(NSData*) responseData
{
NSMutableArray* tempTweets = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:nil];
//convert each element in array into nsdictionary
for (NSDictionary *aTweet in tempTweets)
{
NSLog(@"%@ (by @%@)", [aTweet objectForKey:@"text"], [[aTweet objectForKey:@"user"] objectForKey:@"screen_name"]);
Tweet* theTweet = [[Tweet alloc]init];
theTweet.text = [aTweet valueForKey:@"text"];
theTweet.screenName = [[aTweet valueForKey:@"user"] valueForKey:@"screen_name"];
theTweet.createAt = [aTweet valueForKey:@"create_at"];
NSLog(@"class is %@", [[aTweet valueForKey:@"text"]class]);
[allTweets addObject:theTweet];
}
if([allTweets count]>0)
{
[self.tableView reloadData];
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil)
{
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier];
cell.textLabel.numberOfLines = 0;
cell.detailTextLabel.numberOfLines = 0;
}
NSInteger row = [indexPath row];
Tweet* aTweet = [[Tweet alloc]init];
aTweet = [allTweets objectAtIndex:row];
cell.textLabel.text = aTweet.screenName;
cell.detailTextLabel.text = aTweet.text;
return cell;
}
我应该为NSMutableArray
使用什么属性类型,保留、复制、强。
顺便说一句,我使用Xcode 4.2
2011-11-28 02:54:23.968 SparkTweet[2039:10703]类是uu NSCFString
2011-11-28 02:54:23.969 SparkTweet[2039:10703]-[Tweet
isEqualToString::发送到实例0x6e46c50的选择器无法识别
2011-11-28 02:54:23.970 SparkTweet[2039:10703]*终止应用程序到期
未捕获异常“NSInvalidArgumentException”,原因:'-[Tweet
isEqualToString::发送到实例0x6e46c50'的无法识别的选择器
*第一次抛出调用堆栈:(0x14c1052 0x189dd0a 0x14c2ced 0x1427f00 0x1427ce2 0x1b168f 0x4edf 0x24e548 0x250722 0x1007c7 0x1002c1 0x4371
0x14c2e72 0x98b9ef 0x149597f 0x13f8c39 0x13f8454 0x13f7db4 0x13f7ccb
0x1F879 0x1f8f93e 0x73a9b 0x2bf8 0x2b55 0x1)终止调用
抛出异常
在重新加载数据时引发此异常。NSLog最近发布了20条推文
这是我的tweet类声明
#import <Foundation/Foundation.h>
@interface Tweet : NSObject
{
NSString* name;
NSString* screenName;
NSString* text;
NSString* createAt;
}
@property (copy,nonatomic) NSString* name;
@property (copy,nonatomic) NSString* screenName;
@property (copy,nonatomic) NSString* text;
@property (copy,nonatomic) NSString* createAt;
@end
#导入
@接口Tweet:NSObject
{
NSString*名称;
NSString*屏幕名称;
NSString*文本;
NSString*createAt;
}
@属性(副本,非原子)NSString*名称;
@属性(复制,非原子)NSString*屏幕名称;
@属性(复制,非原子)NSString*文本;
@属性(复制,非原子)NSString*createAt;
@结束
最重要的不是您对allTweets数组使用什么属性,而是如何定义Tweet的属性。如果它们不是retain
,它将崩溃
这是什么
Tweet*aTweet=[[Tweet alloc]init]
aTweet=[allTweets objectAtIndex:row]
您应该将autorelease
添加到cell=[[UITableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]代码>在cellForRowAtIndexPath:
和toTweet*theTweet=[[Tweet alloc]init]
在parseTweetJSON:
您确信parseTweetJSON:是在viewDidLoad之后调用的吗?@Denis是的,我只是更新了我的viewDidLoad方法。你能看看吗?当你运行控制台时,控制台上打印了什么?您在parseTweetJSON
中调用NSLog可能会提示问题所在。除此之外,如果您将allTweets
属性设置为retain
,则应使用[NSMutableArray arraywhithcapacity:50]
@LuizCarlosQuerinoFilho NSLog对其进行初始化。它会打印所有最近的正确推文。什么叫parseTweetJSON?viewDidLoad不叫它…我使用的是带有自动引用计数的Xcode 4.2,发布
,自动释放
不可用。那么请明确说明您在问题中使用了ARC。Xcode版本与ARC使用没有任何联系。在任何情况下,请显示您的Tweet类定义。看起来不错。我找不到问题。不过,我认为你的阵列一切正常。您的异常通常意味着isEqualToString:被发送到解除分配的字符串对象。现在,在您的Tweet中,还有一些其他对象存在于同一地址。因此,您需要找到字符串对象可能被错误释放的位置。我发现了问题,-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(nsindepath*)indepath
此委托方法崩溃。-(CGFloat)tableView:(UITableView*)tableView heightForRowAtIndexPath:(nsindepath*)indepath{CGSize labelsize;UILabel*textDesc1=[[UILabel alloc]init];[textDesc1 setNumberOfLines:0];textDesc1.text=[self.allTweets objectAtIndex:indexPath.row];[textDesc1 SetFontWithName:@“Helvetica”size:14.0];labelsize=[textDesc1.text SizeFont:textDesc1.font constrainedToSize:CGSizeMake(2682000.0)lineBreakMode:uilinebreakmodewrap];labelsize.height=labelsize.height+35;return(CGFloat)labelsize.height;}