2012-12-24 75 views
0

我想知道是否有人可以向我解释这一点。我正在构建一个使用故事板的通用应用程序。 iPhone版本的导航控制器带有主列表视图,然后是子列表视图(都是桌面视图控制器)如何修复iPad上的警告segue

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。

就像我说的,它的工作原理,所以也许这是不是一个真正的问题,但我是一个有点不断出现和存在不确定如何/如果我能修好它警告恼火。

我会尝试在一个位后的故事板的图片,希望这有助于解释这一些。

回答

1

您只需要将您检索的UIViewController与[[segue destinationViewController] topViewController]一起转换为NotesListViewController即可。

那么,你就必须listNotesView = (NotesListViewController *)[[segue destinationViewController] topViewController];

顺便说一句,原因你的代码的作品,但生成一个警告,是因为不管你叫什么类型的对象,即指向内存中的实际类型是最重要的(你可以声明NSString,并分配内存[NSDictionary alloc],但这只会导致混淆)。 -topViewController返回UIViewController对象,因为沿线某处,它返回任何类将从UIViewController继承,像你NotesListViewController做,但没有足够的信息,以便任何比这更具体的,所以你必须给编译器的额外通过类型化对象的信息。

+0

感谢您的解释和解决方案!这很有道理。 – shoesole