Предупреждение: передача несовместимого типа в setRootViewController: - PullRequest
0 голосов
/ 26 сентября 2011

Я делаю калькулятор для 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'

1 Ответ

3 голосов
/ 26 сентября 2011

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

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

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

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

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

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

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

...