Self在调试器中显示“0对象”

时间:2015-08-08 23:29:41

标签: ios objective-c xcode

我是iOS菜鸟。 我遇到了类似的问题:

"self" object for UIViewcontroller has @"0 objects" in debug window in xcode

重新启动xcode无法解决问题。

我可以在主视图控制器的segue之后看到视图控制器中的self对象。我在该视图控制器中有一个UITableViewController,它有一个单独的类用于表的delagete /数据源。一旦我进入这个tableviewcontroller代码,self对象在调试器中显示“0对象”。我相信我正在错误地初始化表视图以不知何故导致此问题,但不太确定如何。

感谢您的帮助。我的代码如下。

    @implementation ConnectTableController

    @synthesize perpArray;
    @synthesize nameArray;

    + (ConnectTableController *)connectTableController
    {
        return [[ConnectTableController alloc] init];
    }


    - (void)viewDidLoad {

        [super viewDidLoad];

        perpArray = [[NSMutableArray alloc] init];
        nameArray = [[NSMutableArray alloc] init];

    }

....



@interface ConnectTableController : UITableViewController <UITableViewDelegate, UITableViewDataSource>  {

    UITableView *tableView;
    NSMutableArray* perpArray;
    NSMutableArray* nameArray;
}


+ (ConnectTableController*) connectTableController;


@property (nonatomic, strong) NSMutableArray  *perpArray;
@property (nonatomic, strong) NSMutableArray  *nameArray;

...


// Parent view controller code


    @implementation ConnectVC


    - (void)viewDidLoad {

        [super viewDidLoad];

        // Set the controller delegate/dataSource for the Table
        connectTableController = [[ConnectTableController alloc] init];
        connectTable.dataSource = connectTableController;
        connectTable.delegate = connectTableController;

        [self addChildViewController:connectTableController];

    }
...


    @interface ConnectVC : UIViewController{


        IBOutlet UIButton *CONNECT;

        ConnectTableController *connectTableController;
        IBOutlet UITableView *connectTable;
    }

1 个答案:

答案 0 :(得分:0)

以下内容也适用于UITableViewControllers,请确保正确访问视图

对于viewController的

“Self”不包含视图,你必须检查“self.view.subViews”,“Self.view.subViews”包含viewController的视图,而不仅仅是“self”。< / p>

例如,如果Self是一个UIViewController,那么以下内容会使您的应用程序崩溃并出现相应的错误:

for(UIView * a in self)
{
    NSLog(@"%@", a.description);
}

error: 
 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UIViewController countByEnumeratingWithState:objects:count:]: unrecognized selector sent to instance 0x7f854176fbf0'

因为uiviewController的“self”不包含视图

而崩溃

但是如果你尝试这个,那么你将有一些工作:

for (UIView *s in self.view.subviews) {
    NSLog(@"%@", s);
}

这将登录到控制台中UIViewController中的所有视图,从而允许您访问视图

此外,您可能正在尝试访问“connectTableController”的视图。要访问此控制器的视图,请按以下步骤操作:

connectTableController.view.subViews。

UITableViewController * aaa = [UITableViewController new];
aaa.tableView;
aaa.view;
aaa.view.subviews;

因此,这意味着您将访问以下内容:

connectTableController.tableView
connectTableController.view.subViews

然后从那里开始,你可以这样做:

connectTableController.tableView.subViews

..当然,如果您要查找的子视图是UITableViewController的tableView的子视图

另外,我认为你在放置UITableViewController的方式是OKAY,但可能不是最好的选择,只是因为它有点复杂而且不像添加它像孩子一样容易使这项工作。你应该使用这样的东西:

    tester2 = [UITableViewController new];
    [self addChildViewController:tester2];
    [self.view addSubview:tester2.view];
    [tester2 didMoveToParentViewController:self];

然后当然/ /如果要删除子视图控制器

,则应该结合使用此方法
- (void)hideContentController:(UIViewController*) content
{
    [content willMoveToParentViewController:nil];
    [content.view removeFromSuperview];
    [content removeFromParentViewController];
}

这有希望给你一个开始,所以也试试这个:

- (void)viewDidLoad {
    [super viewDidLoad];

    // Set the controller delegate/dataSource for the Table
    connectTableController = [[ConnectTableController alloc] init];
    connectTable.dataSource = connectTableController;
    connectTable.delegate = connectTableController;
    [self addChildViewController:connectTableController];
    [self.view addSubview:connectTableController.view];
    [connectTableController didMoveToParentViewController:self];
}

另外,我不知道您需要对委托声明做任何事情,因为子视图控制器基本上是它在世界中的小世界。尝试使用和不使用这些行:

   connectTable.dataSource = connectTableController;
   connectTable.delegate = connectTableController;

我的意思是,可能在UITableViewController实例中声明这些,或者确保将“connectTable”添加到UITableViewController,如下所示:

   cconnectTableController.tableView = connectTable;

[cconnectTableController setTableView:connectTable];

然后你可以试试这个

connectTable.dataSource = cconnectTableController;

等等。

尝试循环并列出结果

for (id s in self.view.subviews) {
    NSLog(@"%@", s);
}