【问题标题】:why I am getting different output in iPhone 4s and iPhone 5?为什么我在 iPhone 4s 和 iPhone 5 中得到不同的输出?
【发布时间】:2013-07-09 11:47:02
【问题描述】:

我有 UITableView,我在其中显示用户列表。现在为了检查目的,我正在显示用户 ID。下面是我正在使用的代码。

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

    // new is JSON data of list of users...
    news = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MainCell"];
    if (cell==nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MainCell"];
    }
    // here in cell I have code to assign data...
    UILabel *myTextLabel = (UILabel*)[cell viewWithTag:9999999999];
    NSLog("id is ===%@===", [[news objectAtIndex:indexPath.row] objectForKey:@"id"]);
    myTextLabel.text = [[news objectAtIndex:indexPath.row] objectForKey:@"id"];

    return cell;
}

当我在 iPhone 4s 上运行它时,我得到以下输出。

id is ===4===
id is ===3===
id is ===2===
id is ===1===

现在我从数据库中手动删除 id 2 并刷新列表。

我得到的输出为

id is ===4===
id is ===3===
id is ===1===

现在我在 iPhone 5(所有 4 个 id)上运行它并获得以下数据....

id is ===4===
id is ===3===
id is ===2===
id is ===1===

现在我手动删除 2 并重新加载列表。

id is ===4===
id is ===3===
id is ===2===
id is ===1===

我仍然得到上述内容。我仍然在列表中获得 2...

为什么我在这里得到两个不同的输出?

尤其是 iPhone 5 正在提供旧输出。


在 iPhone 4 和 iPhone 5 中,我有 iOS 6。

我正在使用 stoaryboards,并且我在两部手机上使用相同的 stoaryboard。


我正在更新数据的代码...

// everytime I am updating list...
-(void) viewWillAppear:(BOOL)animated {
    [self getMyData];
}

-(void) getMyData {
    NSLog(@"getMyData...");
    mainTableView.hidden = YES;
    self.indicator.hidden = NO;
    [self.indicator startAnimating];
    NSURL *url = [NSURL URLWithString:@"http://www.mywebsite.com/xxxx/getBuildingInfoSama.php"];
    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    self.indicator.hidden = NO;
    [self.indicator startAnimating];
    news = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];
    [mainTableView reloadData];
    self.indicator.hidden = YES;
    [self.indicator stopAnimating];
    mainTableView.hidden = NO;
}

- (int) tableView:(UITableView *) tableView numberOfRowsInSection:(NSInteger)section {
    int totalNum = news.count;
    NSLog(@"rows to return %d", totalNum);
    return totalNum;
}

NSLog 说...

2013-07-09 18:50:39.127 SAMA[38573:19d03] getMyData...
2013-07-09 18:50:39.131 SAMA[38573:19d03] rows to return 0
2013-07-09 18:50:39.530 SAMA[38573:19d03] didReceiveResponse
2013-07-09 18:50:39.530 SAMA[38573:19d03] didReceiveData
2013-07-09 18:50:39.531 SAMA[38573:19d03] connectionDidFinishLoading
2013-07-09 18:50:39.532 SAMA[38573:19d03] rows to return 4

主要更新

当我在我的一个朋友 iPhone 5 上运行相同的代码时,它运行良好。没有上述问题。

这意味着,我的应用程序也应该可以在 iPhone 5 上运行。

但问题仍然存在,为什么这在我的客户端 iPhone 5 中不起作用?

有什么想法吗?

【问题讨论】:

  • 您的 iPhone 4S 和 iPhone 5 上的 iOS 版本是什么?您是否为 Retina 3.5 和 Retina 4 使用了不同的 XIB 文件?你能展示你用来从 UITableView 中删除行的代码吗?
  • @hohanghk :我已经更新了问题.. 对于删除,我有将参数传递给 PHP 的代码。就我而言,代码不是问题......
  • 我认为问题出在您的data。在删除后重新加载表视图之前,它可能会以某种方式缓存/未更新。只要你使用的是同一个iOS版本,我认为iPhone 4S和5应该没有区别。试试NSLog(@"%@", news);,看看它是否包含旧的json数据。
  • @howanghk : 现在没有 iPhone 5。我稍后会检查.. 但是如果新闻没有更新,我该如何禁用 iPhone 5 中的缓存?
  • 你能把代码贴在你重新加载tableview的地方吗?同样在删除第二行并停止应用程序并再次运行它之后,您是否仍然在 iPhone 5 上获得所有行?

标签: ios objective-c uitableview


【解决方案1】:

没有理由这样做

news = [NSJSONSerialization JSONObjectWithData:data options:nil error:nil];

cellForRowAtIndexPath。您已经在新闻中加载了之前的数据。

您也可以尝试添加缓存策略

NSURLRequest *request = [[NSURLRequest alloc]initWithURL:url cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5.0];

=== 我认为您在访问新闻时收到错误[CFArray respondsToSelector:]: message sent to deallocated instance 0xa3b4b70 的原因是它尚未分配。 tableview 第一次加载新闻时为 nil,当你执行 objectAtIndex 时,你会得到一个错误。尝试在 viewDidLoad 中执行 alloc init news 或执行延迟加载以确保 new 在第一次被访问时不为零,或者您可以在执行 objectAtIndex 之前检查是否为 nil。

【讨论】:

  • 如果我不使用news=...,我会在[[news objectAtIndex:indexPath.row] objectForKey:@"id"]]得到错误。这就是我得到的*** -[CFArray objectAtIndex:]: message sent to deallocated instance 0xa3d90d0
  • 为什么新闻会被释放。它是类属性吗?
  • @FahimParkar 你在使用 ARC 吗?
  • 当我打印NSLog(@"setting data.......%@", news); 时,我得到[CFArray respondsToSelector:]: message sent to deallocated instance 0xa3b4b70 的错误
  • @Yan :感谢您的回答...我会检查 iPhone 5 并在有任何疑问时回复您...我认为这将解决问题...
【解决方案2】:

1> 获取新闻数组中的数据时重新加载表。 因为表没有reloaddata就不能反映数据。

2> 删除数据库文件 clean build 并再次运行

【讨论】:

  • [mainTableView reloadData];正在做第1点...如果添加或删除数据,您是要说我清理并构建并再次运行它吗???
猜你喜欢
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多