为什么将以下代码从旧条目更改为新条目可以解决以下问题。
代码:
// OLD Entry - Did not work
//[self.window addSubview:navigationController.view];
// NEW Entry - Fixed it
self.window.rootViewController = self.navigationController;
使用旧代码时出现的问题:
我正在使用 UINavigationController 并有一个“mainView”UITableViewController,然后我将一个二级 View 插入堆栈,我们称它为“detailedView”UITableViewController。
从主要内容到详细信息的正常来回导航工作正常
但是当启动时自动启动到第二个 View (当我保存状态)时,我可以进入第二个 View ,但是在这种情况下,工具栏按钮不会出现在第二个 View 的底部。当我返回主页(通过 UINavigationController 标准安排),然后选择 UITableView 中的行,并再次返回同一 View 时,工具栏项显示正常。
无法追踪到这个问题,但最终通过反复试验,我注意到 appDelegate(所有地方)中的代码更改(见上文)似乎解决了这个问题。
有什么想法吗?
编辑:为了完整起见,这里是完整的方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
NSManagedObjectContext *context = [self managedObjectContext];
if (!context) {
abort(); // TODO: Do better job here than abort
}
rootViewController.managedObjectContext = context;
self.window.rootViewController = self.navigationController;
[self.window makeKeyAndVisible];
return YES;
}
编辑 2:哦,我确实有一个 NIB 文件,并且在界面生成器中设置了 Root View Controller /窗口 - 所以我想知道我是否在这里混合了一个 NIB 和编程方法,这可能会导致问题吗?
编辑 3:还注意到以下 didFinishLaunchingWithOptions 代码在我添加“self.window.rootViewController = self.navigationController”行时有效。如果没有这一行(这是 coredatabooks 示例所做的),我就明白了。
RootViewController *rootViewController = (RootViewController *)[navigationController topViewController];
rootViewController.managedObjectContext = self.managedObjectContext;
self.window.rootViewController = self.navigationController; // WORKS WHEN I ADD THIS LINE IN FOR SOME REASON???
// Configure and show the window
[window addSubview:[navigationController view]];
[window makeKeyAndVisible];
return YES;
最佳答案
这两种方法的区别在于,一种会触发 View 生命周期方法,另一种不会。
即设置 window.rootViewController 将导致旧 View Controller 接收消息:viewDidDissaper viewWillDissapear 等。而新 View Controller 将接收 viewWillApear、viewDidAppear 等。
addSubview: 不会这样做。
这有帮助吗?
编辑:
详细阅读您的帖子,您似乎是在详细 View 的 viewDidAppear 方法上以编程方式添加按钮。
从 4.0 开始添加了 UIWindow 的 rootViewController 属性。该文档没有明确提到它将触发 View 生命周期方法,我通过像您一样的跟踪和错误发现了这一点。 (也许有人可以针对苹果文档提出问题)。
如果您需要向后兼容 3.x,您可以使用自定义的 UIWindow 子类。我的代码如下。使用 window.djRootViewController = yourViewController 而不是 window.rootViewController。它专为在界面构建器中使用而设计。
#import <UIKit/UIKit.h>
@interface DJWindow : UIWindow {
UINavigationController* m_navigationController;
}
@property (nonatomic, retain) UIViewController* djRootViewController;
@end
#import "DJWindow.h"
@interface DJWindow()
- (void) customInit;
@end
@implementation DJWindow
- (id) initWithCoder:(NSCoder *)coder {
self = [super initWithCoder:coder];
if (self) {
[self customInit];
}
return self;
}
- (void) customInit {
m_navigationController = [[UINavigationController alloc] init];
m_navigationController.navigationBarHidden = YES;
[self addSubview:m_navigationController.view];
}
- (void) setRootViewController:(UIViewController *)rootViewController {
NSLog(@"ERROR, do not set the rootViewController property, use djRootViewController instead");
}
- (void) setDjRootViewController:(UIViewController *)djRootViewController {
if (djRootViewController == nil) {
[m_navigationController setViewControllers:nil];
} else {
NSArray* vcArray = [NSArray arrayWithObject:djRootViewController];
[m_navigationController setViewControllers:vcArray];
}
}
- (UIViewController*) djRootViewController {
return m_navigationController.visibleViewController;
}
- (void)dealloc
{
[m_navigationController release];
[super dealloc];
}
@end
关于iphone - 为什么这个不同的 "addSubView"代码会导致行为差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5750766/
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou
我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-
我有一个模型:classItem项目有一个属性“商店”基于存储的值,我希望Item对象对特定方法具有不同的行为。Rails中是否有针对此的通用设计模式?如果方法中没有大的if-else语句,这是如何干净利落地完成的? 最佳答案 通常通过Single-TableInheritance. 关于ruby-on-rails-Rails-子类化模型的设计模式是什么?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.co
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在rails源中:https://github.com/rails/rails/blob/master/activesupport/lib/active_support/lazy_load_hooks.rb可以看到以下内容@load_hooks=Hash.new{|h,k|h[k]=[]}在IRB中,它只是初始化一个空哈希。和做有什么区别@load_hooks=Hash.new 最佳答案 查看rubydocumentationforHashnew→new_hashclicktotogglesourcenew(obj)→new_has
为什么4.1%2返回0.0999999999999996?但是4.2%2==0.2。 最佳答案 参见此处:WhatEveryProgrammerShouldKnowAboutFloating-PointArithmetic实数是无限的。计算机使用的位数有限(今天是32位、64位)。因此计算机进行的浮点运算不能代表所有的实数。0.1是这些数字之一。请注意,这不是与Ruby相关的问题,而是与所有编程语言相关的问题,因为它来自计算机表示实数的方式。 关于ruby-为什么4.1%2使用Ruby返
为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar