-2

我有一个 UIviewController。我想添加一个 UIView 作为子视图,但是由于 UIView 没有 viewdidload 方法,我需要手动调用一个方法。我以这种方式使用共享单例来执行此操作:

在 view.mi 中有:

+ (TableLoadGroupMembersViewController *)sharedManager
{
static TableLoadGroupMembersViewController *shaderManager = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    shaderManager = [[TableLoadGroupMembersViewController alloc] init];
});
return shaderManager;
}

- (void)LoadTheView
{
TableViewGroupMembers = [[UITableView alloc] initWithFrame:CGRectMake(0, 0, 320, 460)];
TableViewGroupMembers.dataSource = self;
TableViewGroupMembers.delegate = self;
[TableViewGroupMembers addSubview:TableViewGroupMembers];
}

在 view.h 我有

+ (TableLoadGroupMembersViewController *) sharedManager;
- (void)LoadTheView;

在 viewcontroller.m 我有:

CGRect frame = CGRectMake(100, 100, 300, 100);
TableLoadGroupMembersViewController *view = [[TableLoadGroupMembersViewController alloc] initWithFrame:frame];
[self.view addSubview:view];

TableLoadGroupMembersViewController* sharedSingleton = [TableLoadGroupMembersViewController sharedManager];
[sharedSingleton LoadTheView];

但应用程序崩溃。为什么?

编辑:

错误是:0x281db5d: pushl %esi ... 线程 1: EXC_BAD_ACCESS

4

1 回答 1

0

但应用程序崩溃。为什么?

因此,在这里您正在创建视图控制器的新实例:

TableLoadGroupMembersViewController *view = [[TableLoadGroupMembersViewController alloc] initWithFrame:frame];

这会崩溃。视图有-initWithFrame方法,但您的视图控制器可能没有。

接下来,您将该视图控制器添加为以下的子视图self.view

[self.view addSubview:view];

但是视图控制器不是视图,即使您将变量命名为view,也不能将其添加为子视图。如果第一行没有崩溃,那么这一行会崩溃。

看起来您将视图控制器类与 UIView 子类混淆了。深吸一口气,假装别人写的时候通读代码,试着弄清楚这里应该发生什么。

(但是,如果您花时间在调试器中单步执行您的代码并确定发生崩溃的特定行,这对将来会有很大帮助。)

我不相信(根本)你需要一个单例,但崩溃几乎肯定是发送接收器未实现的消息的问题,它归结为视图和视图控制器之间的这种混淆.

于 2013-06-17T16:24:07.663 回答