Предупреждение: передача несовместимого типа в setRootViewController:

Я делаю калькулятор для iPhone, где при вращении устройства отображается новый вид, и я получаю следующие три ошибки:

CalculatorAppDelegate.m: 21: предупреждение: несовместимые типы Objective-C «struct CalculatorViewController *», ожидаемая «struct UIViewController *» при передаче аргумента 1 «setRootViewController:» из другого типа Objective-C`

эта ошибка (и ниже) из кода:

self.window.rootViewController = self.viewController;

CalculatorAppDelegate.m: предупреждение: семантическая проблема: несовместимые типы указателей, присвоенные «UIViewController *» из «CalculatorViewController *»

приведенная ниже ошибка исходит из:

UIInterfaceOrientation interfaceOrientation = [[object object] orientation];`

CalculatorViewController.m: предупреждение: семантическая проблема: неявное преобразование из типа перечисления «UIDeviceOrientation» в другой тип перечисления «UIInterfaceOrientation»


person user965444    schedule 26.09.2011    source источник
comment
Похоже, ваш CalculatorViewController не является подклассом UIViewController. Вы должны дважды проверить свой файл CalculatorViewController.h.   -  person Joseph Lin    schedule 26.09.2011


Ответы (1)


Для ваших первых 2 ошибок:

  • Либо CalculatorViewController не объявлен как подкласс UIViewController в вашем файле .h
  • Или компилятор не знает об этом, потому что вы забыли #import "CalculatorViewController.h" в своем коде, чтобы компилятор знал о его определении.

Что касается вашей последней проблемы, это связано с тем, что вы неправильно используете UIDeviceOrientation и UIInterfaceOrientation, которые не одного типа (даже очень связанные).

  • UIInterfaceOrientation определить ориентацию интерфейса пользователя. Он имеет только 4 значения: «Портрет», «Пейзаж слева», «Пейзаж справа» или «Вверх ногами».
  • UIDeviceOrientation определить ориентацию устройства. Он имеет 6 значений, определяющих, находится ли ваше устройство прямо, повернуто на 90° влево или вправо, вверх ногами или лицом вниз или вверх.

Если вы настроите свой интерфейс так, чтобы он не вращался (shouldAutorotateToInterfaceOrientation: возвращает YES только для одного из 4 UIInterfaceOrientation), ваш UIDeviceOrientation все равно может измениться (ничто не мешает пользователю повернуть свой iPhone в любое положение). ), но ваш UIInterfaceOrientation не изменится.

Если вы настроите свой интерфейс так, чтобы он вращался (shouldAutorotateToInterfaceOrientation: всегда возвращает YES), когда пользователь поворачивает свой iPhone вправо, UIDeviceOrientation будет UIDeviceOrientationLandscapeRight, потому что iPhone будет повернуто вправо... а UIInterfaceOrientation будет UIInterfaceOrientationLandscapeLeft, потому что ориентация интерфейса будет повернута на 90° влево, так что, поскольку устройство повернуто вправо, интерфейс по-прежнему будет отображаться горизонтально к пользователю.

Вы можете заметить, что UIInterfaceOrientation и UIDeviceOrientation имеют противоположные значения (для перечислений, которые являются общими для обоих; конечно, для UIDeviceOrientationFaceUp и UIDeviceOrientationFaceDown нет соответствующего UIInterfaceOrientation)

person AliSoftware    schedule 26.09.2011