0

我是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];
    }
}

Storyboard 上的视图与我拖放到网格上的 Table View Controller 有一个连接。我点击底部的“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 打印出他们的值。我就是这样做的,我可以看到所有打印出来的值。我不明白......他们确实有分配给他们的价值。问题不在于数据丢失。

4

1 回答 1

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];

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

controller.bookLibrary = ...

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

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

该方法结束。

返回的 Array[... allValues]没有被 Source 视图控制器中的任何东西保留,因此唯一阻止它被垃圾收集的是 Destination view 控制器中指向它的指针。

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

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

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

于 2013-03-10T21:01:13.077 回答