首先,我昨天以不同的方式问了这个问题。经过更多的实验后,我仍然不清楚“为什么”。我了解我需要做的事情,但想弄清楚正在发生的事情。这是场景...
我从一个简单的清单,一个单一视图的应用程序开始,然后简单地将以下NSLog添加到appDelegate……
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
NSLog(@"%@",[self.window.rootViewController description]);
return YES;
}
以上收益
<ViewController: 0x17e7dbf0>
现在,当我创建一个名为“ TestViewController”(类型为UIViewController)的新类并将其分配给故事板中的控制器时,上述NSLog返回
<TestViewController: 0x146594c0>
因此,我的问题是,“如果前面的描述显示rootViewController的类型为“ TestViewController,为什么我需要进行类型转换(TestViewController *)?我为什么不能这样做...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
TestViewController *tvc = self.window.rootViewController;
return YES;
}
代替...
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
TestViewController *tvc = (TestViewController*)self.window.rootViewController;
return YES;
}
我想清除这里的雾气。我错过了哪一个难题?
谢谢你的帮助!
最佳答案
在第二种情况下,您是告诉编译器您更了解。 self.window.rootViewController
的返回类型是UIViewController
指针。但是您正在尝试将其分配给TestViewController
类型的指针。没有强制转换,编译器会警告您这不是适当的分配。通过强制转换,您可以告诉编译器“相信我-我知道视图控制器实际上是TestViewController
”。当然,如果发现您错了,则在运行时可能会出现问题,也可能不会出现问题。
在第一种情况下,您会在运行应用程序时看到实际类的输出。 description
方法返回对象的实际类的名称及其在内存中的地址。
您的两种情况之间确实没有任何关系。
关于ios - 收到以下内容后,为什么必须输入内容?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17767597/