iphone开发:表视图返回空表

时间:2013-03-10 20:40:42

标签: iphone ios objective-c xcode uitableview

我是iOS开发的新手,我在这里或谷歌找不到解决方案,所以我要求绝望。

我有一个“ViewController”类,它是UIViewController的子类。在这里,我有:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([self.bookTitle.text length] > 0)
        self.entries = [self.bookLibrary searchForBook:self.bookTitle.text];

    if ([segue.identifier isEqualToString: @"BookList"]) {
        TableViewController *controller = (TableViewController *)segue.destinationViewController;
        controller.itemCounter = [self.entries count];
        controller.bookLibrary = [self.entries allValues];
    }
}

故事板上的视图与我拖放到网格上的表视图控制器有连接。我单击底部的“Table View Controller”,并在自定义类输入框中设置我的自定义类“TableViewController”。

现在,根据我的理解,上面的方法是将所有数据正确传递给TableViewController。

这是我在TableViewController

中使用的方法之一
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"BookCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    Book* book =  [self.bookLibrary objectAtIndex:indexPath.row];

    cell.textLabel.text = book.title;
    NSLog(@"%@", book.title);
    return cell;

}

NSLog条目将所有书名打印到控制台,因此我知道数据正在传递。但是,当我运行程序并单击按钮以拉出表视图时,它只是一个空表。任何提示?我可以上传整个项目。在这几个小时,有点沮丧。请帮忙:(

编辑:建议我查看表格方法中数据变量的状态。它表明他们的状态不是我认为的状态,我应该使用NSLog来打印他们的值。我做到了这一点,我可以看到打印出的所有值。我不明白......他们确实有分配给他们的价值观。问题不在于数据丢失。

1 个答案:

答案 0 :(得分:0)

确保您使用UITableViewController子类作为VC(如果您正在使用托盘中的UITableViewController ui对象),或者您正在将UITableView的委托和数据源属性正确连接到VC(如果你正在使用普通的UIViewController对象和子类)。

(见问题评论)。

试试这个:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"bookLibrary.count %d", bookLibrary.count);
    return [bookLibrary count];
}

你会发现事情不是你认为的那样......添加viewDidLoadviewWillAppear的实现,每个都有自己的“我在这里”NSLog声明,并跟踪出现的第二个视图控制器的流程。同样,你会发现你有一些排序问题,其中流程不像你想象的那样工作。


添加评论:

最终,问题的根源是你的“发送”控制器准备segue方法的这一行:

controller.bookLibrary = [self.entries allValues];

这是做什么的?它在Dictionary对象上调用allValues。该方法生成一个包含值的新数组(!)。您不会将新的Array对象存储在任何永久存储中。你只需用它来设置:

controller.bookLibrary = ...

因此,在该语句执行之后,您有:

  • 您的prepareForSegue方法中的一个Array对象(代码正在执行),您只存储在一个变量/ holder中,这是:
  • 在目标视图控制器(TableViewController)中指向该对象的指针

该方法结束。

[... allValues]返回的数组未被Source视图控制器中的任何内容保留,因此唯一阻止它被垃圾回收的是在Destination视图控制器中指向它的指针。

但该指针是一个指针。根据定义,如果这是指向对象的唯一指针,则指针将设置为nil并释放对象以进行垃圾回收。 Poof!没有更多的数组对象,你只剩下一个nil指针。

正如您所发现的那样,将“接收器”设置为 strong 可让它保持该Array对象,即使在其他代码退出之后它也是唯一指向该数组的指针。

(并且,你的代码没有被调用两次。如果你仔细查看日志记录 - 或者更好的是在表get-row-count方法中设置一个断点 - 你会看到它只被调用一次早期记录的“我有8个对象”在其他代码中发生,而不是在TableViewController中。)