6

问题

一个 IBOutlet 在我有机会使用它之前就发布了。

我想要的是

我想从我的应用程序委托访问导航控制器,以便重新加载表格视图。

我的设置

我有:

  • 在目标设置中设置为主界面的 Main.xib
  • 导航控制器的 IBOutlet 作为我的应用程序委托上的 ivar
  • 此 IBOutlet 连接到 Main.xib 中的正确导航控制器
  • App Delegate 在 xib 中实例化,但未设置为文件的所有者

我正在使用 ARC、Xcode 4.3.2 和 iOS5.1

我试过的

  • 更改部署目标
  • 为导航控制器、应用程序委托在 dealloc 上设置断点——它们永远不会被调用
  • 阅读我在 ARC 和 IBOutlets 上可以找到的所有内容 - 似乎没有什么与我正在做的事情相矛盾
  • 创建一个只需要最少类的新项目 - 我看到完全相同的问题

代码

KPAppDelegate.h

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> {
    IBOutlet  KPBrowseExpensesNavigationController *nc;
}

@property (strong) IBOutlet KPBrowseExpensesNavigationController *nc;

KPAppDelegate.m

@implementation KPAppDelegate

@synthesize nc;

-(void)setNc:(KPBrowseExpensesNavigationController *)nc_ {
    nc = nc_; // This gets called on view load and nc gets set.
}

...snip...

// This is called about 5 seconds after app startup
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
        // By the time we get here, nc is nil.
        UITableViewController *tvc = [[nc viewControllers] objectAtIndex:0];
        [[tvc tableView] reloadData];
}

@end

更新

必须在这里做一些非常愚蠢的事情。即使是一个非常简单的项目仍然会显示这个问题。请参阅下面的链接。

下载一个显示问题的简单测试项目。

4

4 回答 4

2

你的接口生成器的出口是否设置为一种KPBrowseExpensesNavigationController类型?如果不是,它不会在您的 nib 和 ViewController 之间创建连接。

您应该在 Identity Inspector 中将其自定义类设置为 KPBrowseExpensesNavigationController

于 2012-06-19T12:33:56.810 回答
2

在 Window nib 中,将 FilesOwner 类设置为 UIApplication,然后将它的委托从 Outlets 指向 AppDelegate 对象。这是您的项目示例中的错误。

于 2012-06-19T13:51:28.980 回答
1

我不确定您为什么将其声明为财产和非财产。我应该做这样的事情:

@interface KPAppDelegate : UIResponder <UIApplicationDelegate> 

@property (nonatomic, strong) IBOutlet KPBrowseExpensesNavigationController *nc;

在您的实施中:

@implementation KPAppDelegate

@synthesize nc = _nc; // So you don't accidentally use nc

...snip...

// This is called about 5 seconds after app startup
-(void)objectLoader:(RKObjectLoader *)objectLoader didLoadObjects:(NSArray *)objects {
        // By the time we get here, nc is nil.
        UITableViewController *tvc = [[**self.nc** viewControllers] objectAtIndex:0];
        [[tvc tableView] reloadData];
}

@end

希望这可以帮助!

于 2012-06-19T12:19:16.387 回答
1

我没有看到您分配导航控制器的位置。仅声明该属性不会为其分配任何值,因此它将为零。在您-didFinishLaunchingWithOptions的应用程序委托中,设置您的 alloc/init 语句。其他一切看起来都很好。

KPBrowseExpensesNavigationController *nc = [[KPBrowseExpensesNavigationController alloc] init];

如果您有自定义初始化,您也可以使用它,但请确保在尝试使用它之前进行设置。

于 2012-06-19T13:45:08.897 回答