从视图控制器显示新的视图控制器

时间:2012-12-18 12:51:51

标签: objective-c xcode uiviewcontroller

我正在编写一个与CPP代码集成的iPhone应用程序,我使用C接口文件作为Objective-C和CPP代码之间的通用接口。

我正尝试使用以下代码从当前视图中显示新视图:

viewTowController *screen = [[viewTwoController alloc] initWithNibName:nil bundle:nil];
[self presentModalViewController:screen animated:YES];

我之前也使用过这段代码,但它是按钮点击事件,它工作得很好,但我需要根据CPP代码生成的事件显示一些视图(在从CPP调用的回调函数上)。

当我从CPP回调函数调用此代码时,如下所示:

-(void) displayView
{
    viewTwoController *screen = [[viewTwoController alloc] initWithNibName:nil bundle:nil];
    [self presentModalViewController:screen animated:YES];
}

//-- C Interface Function Implementation --//
void onDisplayView(void *self)
{
    [(id) self displayView]; 
}

我无法看到添加到屏幕的视图,我在控制台日志窗口中收到了大量以下错误。

2012-12-18 18:03:02.128 p2pwebrtc[5637:5637] *** _NSAutoreleaseNoPool(): Object 0x4f04520 of class UIView autoreleased with no pool in place - just leaking
Stack: (0x305a2e6f 0x30504682 0x309778ac 0x7db6 0x7d28 0x33bb 0x6fb0 0x1af865 0x1afb4a 0x1afc5e 0x62a1 0x373e 0x4672 0x39937f 0x3ca1e4 0x3ca265 0x3cc6 0x926d8155 0x926d8012)

AM我在这个方面做错了什么,或者还有其他办法吗?

更新**

正如答案所示,我需要在UI线程中执行此代码,为此我需要在代码下面执行:

dispatch_async(dispatch_get_main_queue(), ^{
    [(id) self displayView];
});

当我在Objective-C函数或CPP函数中调用此代码时,我得到ERROR 'dispatch_get_main_queue' was not declared in this scope

我也在使用OSX版本10.5.8和Xcode版本3.1.3

1 个答案:

答案 0 :(得分:1)

确保你在主线程上调用UIKit,如下所示:

void onDisplayView(void *self) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [(id) self displayView];
    });
}

如果你的目标是旧版本的iOS(pre-GCD),你可以改为

// assuming `self` inherits from NSObject, of course
void onDisplayView(void *self) {
    [self performSelectorOnMainThread:@selector(displayView) withObject:nil waitUntilDone:NO];
}