我是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来打印他们的值。我做到了这一点,我可以看到打印出的所有值。我不明白......他们确实有分配给他们的价值观。问题不在于数据丢失。
答案 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];
}
你会发现事情不是你认为的那样......添加viewDidLoad
和viewWillAppear
的实现,每个都有自己的“我在这里”NSLog声明,并跟踪出现的第二个视图控制器的流程。同样,你会发现你有一些排序问题,其中流程不像你想象的那样工作。
添加评论:
最终,问题的根源是你的“发送”控制器准备segue方法的这一行:
controller.bookLibrary = [self.entries allValues];
这是做什么的?它在Dictionary对象上调用allValues
。该方法生成一个包含值的新数组(!)。您不会将新的Array对象存储在任何永久存储中。你只需用它来设置:
controller.bookLibrary = ...
因此,在该语句执行之后,您有:
该方法结束。
由[... allValues]
返回的数组未被Source视图控制器中的任何内容保留,因此唯一阻止它被垃圾回收的是在Destination视图控制器中指向它的指针。
但该指针是一个弱指针。根据定义,如果这是指向对象的唯一指针,则指针将设置为nil并释放对象以进行垃圾回收。 Poof!没有更多的数组对象,你只剩下一个nil指针。
正如您所发现的那样,将“接收器”设置为 strong 可让它保持该Array对象,即使在其他代码退出之后它也是唯一指向该数组的指针。
(并且,你的代码没有被调用两次。如果你仔细查看日志记录 - 或者更好的是在表get-row-count方法中设置一个断点 - 你会看到它只被调用一次早期记录的“我有8个对象”在其他代码中发生,而不是在TableViewController中。)