0

我有一个 UIViewController,它有三个视图:类别 -> 子类别 -> 详细视图。子类别和详细视图的内容取决于在类别视图中单击了哪一行。这是通过一个名为“categoryClicked”的属性完成的,并在 sub-category.m 文件中声明。它的值在 category.m 文件中由以下代码行给出。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    Sub-category *sub = [[Sub-category alloc] initWithNibName:@"Sub-category" bundle:nil];

    sub.categoryClicked = [_categoryArray objectAtIndex:indexPath.row];
    [self.navigationController pushViewController:rubrieken animated:YES];

}

这工作得很好,直到我想在详细视图中使用 categoryClicked 的值。在 category.m 和 DetailView.m 中都导入了 sub-category.m。出于测试目的,我在 Detail View 上放置了一个标签,在 DetailView.m 文件中我有以下代码:

Sub-category *sub = [[Sub-category alloc] initWithNibName:@"Sub-category" bundle:nil];

label.text = sub.categoryClicked;

我确信这段代码应该可以完成这项工作,但实际上我得到了一个空标签。有没有人能告诉我我做错了什么。

编辑
categoryClicked 是在 Sub-category.h 中声明并在 Sub-category.m 中合成的属性。想发布更多代码,但没有更多相关代码。

4

2 回答 2

0

当你alloc是一个对象时,你正在为它分配内存空间。然后,当您使用带有init(like initWithNibName) 的东西时,您正在初始化它。因此,当您为其分配内存空间sub并对其进行初始化时,您将拥有一个对象。但是然后你alloc又一次init,它创建了一个全新的(并且完全不相关的)对象。确保删除任何可能破坏旧对象的东西。

此外,该*符号表示它sub是一个指针(它指向一个内存位置)。每当您使用赋值运算符 ( =) 时,您就是在告诉它指向一个新事物。您正在做的是告诉label.text指针指向sub所指向的内容。但是,如果您更改sub指向的内容并指向label.text同一事物,则两者都不会指向您想要的值。

希望这足够清楚,如果它不尝试发布更多代码,也许有人可以建议确切的更改。

-编辑-

如果你想引用一个对象,你只能通过几种方式获得它。重要的是要知道,您不能真正“创建”对现有对象的引用。您必须与对象有某种联系。

  • 在文件中声明要引用的对象,例如Category c = [[Category alloc] init];记住这会创建一个新对象,它不会创建对现有对象的引用。但是,在另一个对象内部创建对象意味着一个“拥有”另一个对象,并且可以对它做任何想做的事情(显然包括访问属性和调用方法)。
  • 使用对象的“链”来获取对对象的引用。因此,如果您的文件拥有一个拥有您想要的对象的文件,您可以使用topfile.otherfile.objectyouwant. 最明显的例子是获取对子视图拥有的对象的引用。

这是最基本的。请记住,没有任何“全局”对象可以通过名称调用。如果您的问题不能由此解决,请查看一些示例代码并尝试了解引用的工作原理,或者发布另一个与您的问题更密切相关的问题

于 2012-07-02T15:04:39.427 回答
0

这条线...

Sub-category *sub = [[Sub-category alloc] initWithNibName:@"Sub-category" bundle:nil];

...创建一个新的Sub-category. 由于它是新的,它不知道已将哪些信息提供给其他Sub-category对象。如果要访问现有对象的数据,则需要获取对现有对象的引用。

于 2012-07-02T14:27:08.073 回答