我想知道是否有人可以向我解释这个问题。我正在使用故事板构建通用应用程序。 iPhone版本有一个带有主列表视图的导航控制器,然后是一个子列表视图(都是tableview控制器。
iPad应用程序使用分割视图控制器来实现与iphone相同的功能(主列表,带有详细列表)。一切都很好,但是当使用“替换”segue转换到拆分视图控制器上的新细节视图时,我必须在他们自己的导航控制器中嵌入新的细节视图,而我不需要在iphone上执行此操作(它已经在导航控制器中了。(希望这有点意义)
我的代码(有效)最终看起来像这样:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
NotesListViewController *listNotesView;
if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {
listNotesView = [[segue destinationViewController] topViewController];
} else {
listNotesView = [segue destinationViewController];
}
if ([segue.identifier isEqualToString:@"NotesByDate"]) {
[listNotesView setGroupType:@"date"];
} else if ([segue.identifier isEqualToString:@"NotesByTopic"]) {
[listNotesView setGroupType:@"topics"];
} else if ([segue.identifier isEqualToString:@"NotesBySpeaker"]) {
[listNotesView setGroupType:@"speaker"];
}
所以......问题是IF语句的第一个条件是生成警告(从UIViewController分配给NoteListViewController的不兼容指针类型)。但是,它不是UIViewController,它是一个UITableViewController。在iPhone版本上它将是一个UIView,但我在这里专门检查iPad。
就像我说的,它有效,所以也许这不是一个真正的问题,但我对这种警告不断出现并且不确定如何/如果我能解决它感到有些恼火。
我会尝试稍微发布故事板的图像,希望这有助于解释这一点。
答案 0 :(得分:1)
您所要做的就是将使用[[segue destinationViewController] topViewController]
检索的UIViewController强制转换为NotesListViewController
。
那么,你会listNotesView = (NotesListViewController *)[[segue destinationViewController] topViewController];
另外,你的代码工作但产生警告的原因是因为无论你调用一个对象是什么类型,内存中指向的实际类型都是重要的(你可以声明一些东西为一个NSString
并使用[NSDictionary alloc]
分配内存,但这只会导致混淆)。 -topViewController
返回一个UIViewController
对象,因为该行的某个位置,它返回的任何类都会从UIViewController
继承,就像NotesListViewController
那样,但它没有足够的信息比任何更具体,所以你必须通过类型化对象给编译器提供额外的信息。