考虑以下场景:我有一个基于故事板的应用程序.我将一个ViewController对象添加到storyboard中,将此ViewController的类文件添加到项目中,并在IB身份检查器中指定新类的名称.现在我将如何从AppDelegate以编程方式引用此ViewController?我已经使用相关类创建了一个变量并将其转换为IBOutlet属性,但我没有看到任何方法能够在代码中引用新的ViewController - 任何尝试按住Ctrl键拖动连接都不起作用.
即在AppDelegate中我可以像这样到达基本的ViewController
(MyViewController*) self.window.rootViewController
Run Code Online (Sandbox Code Playgroud)
但故事板中包含的任何其他ViewController怎么样?
当我模拟我的应用程序时出现此问题,它不是错误或警告但它出现在我的控制台中,有没有人曾经遇到过这个问题?
我有一个包含表视图的视图控制器,可以选择表中的项目和正确创建的详细视图控制器.
表中的项表示可以具有与其关联的基于时间的触发器的项目,并且为每个项目安排本地通知,如果当本地通知到期时应用程序在前台,则自动显示该项目的详细视图.
我有一个问题,当两个通知同时到期导致视图无法正常显示时,以及控制台日志:"NNN的开始/结束外观转换的不平衡调用",其中NNN是我的详细视图控制器.
表视图控制器创建如下:
self.tableViewController = [[TableViewController alloc] initWithNibName:@"TableView" bundle:nil];
UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:self.tableViewController];
self.window.rootViewController = navController;
Run Code Online (Sandbox Code Playgroud)
当本地通知到期并且调用didReceiveLocalNotification:时,app会使用NSNotifcationCenter postNotificationName:来广播通知,并且表视图控制器正在侦听该通知.当表视图控制器收到该通知时,它会创建详细视图控制器并将其推送到堆栈,如下所示:
[self.navigationController pushViewController:detailViewController animated:YES];
Run Code Online (Sandbox Code Playgroud)
我在某处读到如果一个视图控制器在它本身不在堆栈顶部时推送另一个视图控制器可能会出现问题 - 所以我认为这一定是问题,因为当表视图控制器收到第二个通知时它会不再位于导航堆栈的顶部,因为它在以前只是在第一个通知到达时将详细视图控制器推送到堆栈上.
所以我将推送代码更改为:
[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];
Run Code Online (Sandbox Code Playgroud)
但它没有任何区别.
所以我接下来认为可能会出现问题,因为第一个细节视图控制器没有机会在推送第二个视图控制器之前完全显示 - 所以我改变了我的应用程序的通知发布使用:
[[NSNotificationCenter defaultCenter] postNotificationName:
Run Code Online (Sandbox Code Playgroud)
至
[[NSNotificationQueue defaultQueue] enqueueNotification: postingStyle:NSPostWhenIdle]
Run Code Online (Sandbox Code Playgroud)
因此推送不会发生在app循环的相同迭代中.但这没有任何区别,也没有试图推迟推送详细视图控件:
double delayInSeconds = 0.1;
dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
[[self.navigationController topViewController].navigationController pushViewController:detailController animated:YES];
});
Run Code Online (Sandbox Code Playgroud)
我不知道问题是什么或接下来要尝试什么,任何想法?
我目前正在假设-performSelector:withObject:afterDelay:不使用线程,但安排事件在以后的日期在当前线程上触发.它是否正确?
进一步来说:
- (void) methodCalledByButtonClick {
for (id obj in array) {
[self doSomethingWithObj:obj];
}
}
static BOOL isBad = NO;
- (void) doSomethingWithObj:(id)obj {
if (isBad) {
return;
}
if ([obj isBad]) {
isBad = YES;
[self performSelector:@selector(resetIsBad) withObject:nil afterDelay:0.1];
return;
}
//Do something with obj
}
- (void) resetIsBad {
isBad = NO;
}
Run Code Online (Sandbox Code Playgroud)
假设我们在主线程上运行,即使需要任意长的时间来完成,它是否保证-resetIsBad在-methodCalledByButtonClick返回之后才会被调用-methodCalledByButtonClick?
我有一个UITabBarController,在初始运行时,我想覆盖登录视图控制器但收到错误.
对<UITabBarController:0x863ae00>的开始/结束外观转换的不平衡调用.
下面是代码.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease];
// Override point for customization after application launch.
UIViewController *lessonVC = [[[LessonViewController alloc] initWithNibName:@"LessonViewController" bundle:nil] autorelease];
UIViewController *programVC = [[[ProgramViewController alloc] initWithNibName:@"ProgramViewController" bundle:nil] autorelease];
UIViewController *flashcardVC = [[[FlashCardViewController alloc] initWithNibName:@"FlashCardViewController" bundle:nil] autorelease];
UIViewController *moreVC = [[[MoreViewController alloc] initWithNibName:@"MoreViewController" bundle:nil] autorelease];
UINavigationController *lessonNVC = [[[UINavigationController alloc] initWithRootViewController:lessonVC] autorelease];
UINavigationController *programNVC = [[[UINavigationController alloc] initWithRootViewController:programVC] autorelease];
UINavigationController …Run Code Online (Sandbox Code Playgroud) 我有一个几乎完美运行的应用程序.以下是我的应用程序的结构:
故事板上共有6个视图控制器.前3个视图控制器是最重要的.初始视图控制器具有"登录"和"注册"按钮."登录"按钮以模态方式呈现登录视图控制器,"注册"按钮以模态方式呈现注册视图控制器.
注册视图控制器有3个用户名,密码和电子邮件字段,然后是"提交"按钮.提交按钮将数据提交给我的Web服务器,如果所有内容都成功提交,则会调用"performSegueWithIdentifier"方法.
这是声明:
[self performSegueWithIdentifier:@"superSegue" sender:self];
Run Code Online (Sandbox Code Playgroud)
我今晚花了2个小时试图让上面的方法调用工作,它最终确实有效.为了让它工作,我不得不在故事板上选择我的注册视图控制器并转到编辑器>嵌入>导航控制器(如果我没记错的话,我必须这样做,因为注册视图控制器是以模态方式呈现的).然后我从我的注册视图控制器的提交按钮拖到我想要推送到的视图控制器并选择了推送,然后键入标识符名称.
无论如何,以上所有工作完全正常,直到我尝试使用我们推送到使用方法调用的View Controller上的后退按钮.如果我点击后退按钮,它会进入90%的黑色屏幕,顶部有一个空白的导航栏,后面有一个按钮,当然后面按钮也没有任何效果.
这是我在控制台中收到的错误:
Unbalanced calls to begin/end appearance transitions for <VerificationViewController: 0x14ed1bb0>
Run Code Online (Sandbox Code Playgroud)
验证视图控制器是注册视图控制器通过performSegueWithIdentifier方法推送的视图控制器.
有谁知道如何解决这个错误?
我在下面列出了我的故事板在xcode中的样子.有一个我已经编码但尚未连接的视图控制器,不管怎样都不应该有所不同,所以你可以忽略Login VC右侧的View Controller.

objective-c uiviewcontroller uinavigationcontroller ios segue
我将我的Swift应用程序升级到Xcode 7/Swift 2.0,现在我的应用程序突然发现某些segues不再有效.
我有一个segue弹出一个"Check In"模式并且它完美地工作,但是我有另一个segue弹出一个"Check Out"模式,它几乎相同并且它不会启动并且应用程序被冻结.
我从头开始重新创建了segue,确认它与"Check In"相同,但它仍然不起作用.
相反,我也尝试启动空白视图而不是我的Check Out模式,它工作正常.
没有错误,它只是冻结,我确实正确地调用了"prepareForSegue"部分但是我的模态的"viewDidLoad"部分没有被调用.
仅供参考,我已关闭自动布局.
ios ×5
iphone ×4
objective-c ×3
cocoa-touch ×1
ipad ×1
segue ×1
storyboard ×1
swift ×1
transition ×1
transitions ×1
xcode7 ×1