Как исправить предупреждение о переходе на iPad

Мне было интересно, может ли кто-нибудь объяснить это мне. Я создаю универсальное приложение, используя раскадровки. Версия для iPhone имеет навигационный контроллер с основным представлением списка, а затем представлением вложенного списка (оба являются контроллерами табличного представления.

Приложение для iPad использует контроллер с разделенным представлением для достижения того же результата, что и для iphone (основной список с подробным списком). Все хорошо, однако при использовании перехода «заменить» для перехода к новому подробному представлению на контроллере разделенного представления мне нужно встроить новые подробные представления в свой собственный навигационный контроллер, тогда как мне не нужно делать это на 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 генерирует предупреждение (несовместимый тип указателя, присвоенный NoteListViewController из UIViewController). Однако это не UIViewController, а UITableViewController. В версии для iPhone это БУДЕТ UIView, но я специально проверяю здесь iPad.

Как я уже сказал, это работает, так что, возможно, это на самом деле не проблема, но меня немного раздражает постоянно появляющееся предупреждение, и я не уверен, как/могу ли я это исправить.

Я постараюсь немного опубликовать изображения раскадровки, надеюсь, это поможет объяснить это.


person shoesole    schedule 24.12.2012    source источник


Ответы (1)


Все, что вам нужно сделать, это преобразовать UIViewController, полученный с помощью [[segue destinationViewController] topViewController], в NotesListViewController.

Итак, у вас будет listNotesView = (NotesListViewController *)[[segue destinationViewController] topViewController];

Кроме того, причина, по которой ваш код работает, но генерирует предупреждение, заключается в том, что независимо от того, какой тип вы вызываете для объекта, фактический тип, который имеет значение в памяти (вы можете объявить что-то как NSString и выделить память с помощью [NSDictionary alloc], но это приведет только к путанице). -topViewController возвращает объект UIViewController, потому что где-то в строке любой класс, который он возвращает, будет наследовать от UIViewController, как это делает ваш NotesListViewController, но у него недостаточно информации, чтобы быть более конкретным, поэтому вы должны дать компилятору дополнительные информацию путем приведения объекта к типу.

person Echihl    schedule 24.12.2012
comment
Спасибо за объяснение и решение! Это имеет смысл. - person shoesole; 25.12.2012