0

我想知道是否有人可以向我解释这一点。我正在使用故事板构建一个通用应用程序。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。

就像我说的那样,它有效,所以也许这不是一个真正的问题,但我对不断出现的警告以及不确定如何/是否可以修复它感到有点恼火。

我会尝试稍后发布故事板的图像,希望这有助于解释这一点。

4

1 回答 1

1

您所要做的就是将您检索[[segue destinationViewController] topViewController]到的 UIViewController 类型转换为NotesListViewController.

所以,你会listNotesView = (NotesListViewController *)[[segue destinationViewController] topViewController];

顺便说一句,你的代码工作但产生警告的原因是因为无论你调用什么类型的对象,内存中指向的实际类型才是最重要的(你可以将某些东西声明为 anNSString并分配的记忆[NSDictionary alloc],但这只会导致混乱)。-topViewController返回一个UIViewController对象,因为沿线某处,它返回的任何类都将继承自UIViewController,就像您NotesListViewController所做的那样,但是它没有足够的信息来比这更具体,因此您必须通过类型转换为编译器提供额外的信息目的。

于 2012-12-24T18:17:22.320 回答