Подтвердить что ты не робот

Обработка делегатов приложений и переключение между представлениями

Я получаю предупреждение о семантической проблеме, относящейся к передаче *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;

ПродуктыViewController.m содержит:

@synthesize delegate;

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

EDIT: Вот точное предупреждение, поскольку оно появляется на строке "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]
4b9b3361

Ответ 1

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

  • Объявите класс self (независимо от того, что этот класс), в его инструкции @interface, чтобы соответствовать протоколу ProductViewControllerDelegate:

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

    controller.delegate = self;
    

    :

    controller.delegate = (id)self;
    

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

Ответ 2

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

Ответ 3

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

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

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

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

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