Обработка делегатов приложения и переключение между представлениями - PullRequest
29 голосов
/ 16 июня 2011

Я получаю предупреждение о семантической проблеме, связанной с передачей *const _strong типу id, и, кажется, не могу исправить это, независимо от того, что я изменяю.

У меня есть два представления в данный моменти написал этот код.В iPadSpeckViewController.m есть метод, который должен переключаться между представлениями:

-(IBAction) touchProducts {
    ProductsViewController *controller = [[ProductsViewController alloc]
            initWithNibName:@"Products" bundle:nil];
    controller.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    controller.delegate = self;
    [self presentModalViewController:controller animated:YES];
}

А для ProductsViewController.h:

@interface ProductsViewController : UIViewController {
    id<ProductsViewControllerDelegate> delegate;
}
@property(nonatomic, retain)
    IBOutlet id<ProductsViewControllerDelegate> delegate;

ProductsViewController.m содержит:

@synthesize delegate;

Но представления не переключаются ... Мысли?

РЕДАКТИРОВАТЬ: Вот точное предупреждение, как оно появляется в строке "controller.delegate = self;"в iPadSpeckViewController.m:

/Developer/iPadSpeckApp/iPadSpeckApp/iPadSpeckAppViewController.m:17:27:{17:27-17:31}: warning: passing 'iPadSpeckAppViewController *const __strong' to parameter of incompatible type 'id<ProductsViewControllerDelegate>' [3]

Ответы [ 3 ]

152 голосов
/ 31 октября 2011

Это предупреждение странно сформулировано, но на самом деле это всего лишь способ сообщить вам, что класс self (каким бы он ни был) не соответствует протоколу ProductsViewControllerDelegate. Чтобы избавиться от предупреждения, у вас есть два варианта:

  • Объявите класс self (каким бы ни был этот класс) в своем выражении @interface для соответствия протоколу ProductsViewControllerDelegate:

    @interface MyClass : NSObject <ProductsViewControllerDelegate>;
    
  • Подавить предупреждение, изменив это:

    controller.delegate = self;
    

    к этому:

    controller.delegate = (id)self;
    

Свойство делегата имеет тип id<ProductsViewControllerDelegate>. Но это не так. В ARC вы должны сделать приведение явным, чтобы типы были формально согласованы. (Я полагаю, что это так, что ARC может быть абсолютно уверена, что обладает достаточной информацией для принятия правильных решений по управлению памятью.)

0 голосов
/ 23 октября 2011

Получена та же ошибка, когда я попытался установить делегат UINavigationController для объекта, который реализовал неправильный протокол (UINavigationBarDelegate вместо UINavigationControllerDelegate).Это может быть простая опечатка.

0 голосов
/ 16 июня 2011

Если вы хотите только переключать представления, вы можете попробовать код ниже.Это работает для меня.

ProductsViewController *controller = [[ProductsViewController alloc] initWithNibName:@"Products" bundle:nil];
[self.navigationController pushViewController:controller animated:YES];

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

Если вам нужна особая анимация (кажется, я видел Cross Dissolve?) Впрочем, понятия не имею.Я попытаюсь покопаться в документации, чтобы увидеть, и я скажу вам, что я нахожу.

Что касается "* const_string для ввода идентификатора", хотя я не знаю, что вы пытаетесь сделать с вашимприложение, я думаю, что проблема в id <ProductsViewControllerDelegate> delegate в вашем контроллере представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...