2016-09-23 1 views
0

У меня есть приложение для iPad, которое я написал несколько лет назад, используя Greg Coombs 'IntelligentSplitViewController, который позволяет создавать макет, похожий на вращающийся UITabBarController в приложении для iPhone. Недавний выпуск прошивки 10 нарушил это таким образом, что имеет previously been described для более ранней версии в этом списке: objc_msgSend выдает сообщение об ошибке, что существует конечное число аргументов, тогда как ожидающая 0.Тип self и делегат для кастинга для исправления objc_msgОтправить неправильное количество аргументов error?

ответ на это @rintaro должно было выполнить тип cast для другого метода (typed_msgSend) для использования вместо objc_msgSend. В ответ на код другого плаката с два аргументов это: код

id (*typed_msgSend)(id, SEL) = (void *)objc_msgSend; 

Грега является немного более сложным, и учитывая мою слабость в Objective-C У меня возникают трудности с делать что-то похожее на его код. (Greg, к сожалению, был болен и перестал поддерживать это.) Детали следующим образом:

- (void)willRotate:(NSNotification*)notification 
{ 
... 
    if (UIInterfaceOrientationIsPortrait(toOrientation)) 
    { 
     @try 
    { 
     UIPopoverController *popover = [super valueForKey:@"_hiddenPopoverController"]; 
     objc_msgSend(theDelegate, @selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:), self, master, button, popover); 
    ... 

Таким образом, вопрос, каковы типы данных шесть аргументов? Мои попытки были:

  1. theDelegate - неуверены - перепробовал идентификатор 'или 'ID <UISplitViewControllerDelegate>'(из его декларации)
  2. @selector ... - SEL (по аналогии с ответом)
  3. самостоятельно - действительно не знаю - перепробовал идентификатор '
  4. мастер - UIViewController * (из декларации)
  5. кнопки - UIBarButtonItem * (от decla Рацион)
  6. поповера - UIPopoverController * (из декларации)

Это создает, но сбои в основном после заставки. Конечно, это может быть сбой по какой-то другой причине, но если я не уверен, что я сделал правильный выбор, я не знаю. (Как я хочу, чтобы это были Java.)

+0

Почему вы используете 'objc_msgSend' вместо стандартного синтаксиса вызова метода? – rmaddy

+0

@maddy - Потому что это код в классе, который я получил, который решил мою оригинальную проблему. Я этого не писал. – David

+1

Затем замените неподходящий вызов 'objc_msgSend' обычным вызовом метода и устраните проблему. – rmaddy

ответ

1
void (*my_objc_msgSend)(id, SEL, id, id, id, id) = (__typeof(my_objc_msgSend))objc_msgSend; 
my_objc_msgSend(theDelegate, @selector(splitViewController:willHideViewController:withBarButtonItem:forPopoverController:), self, master, button, popover); 

в ObjC, id является точкой структуры. любой объект (наследуемый класс от NSObject) может использовать вместо него id.

, пожалуйста, опубликуйте журнал, если все еще произошел сбой.

После iOS 9, splitViewController:willHideViewController:withBarButtonItem:forPopoverController: устарел, вы должны использовать вместо него splitViewController:willChangeToDisplayMode:.

+0

Спасибо за помощь. К сожалению, он все еще падает. Соответствующая (я надеюсь) часть журнала сбоев была: «Завершение приложения из-за неотображенного исключения» NSUnknownKeyException », причина:« [ valueForUndefinedKey:]: этот класс не является ключевым значением, совместимым с кодировкой для ключа _hiddenPopoverController. '' – David

+0

Похоже, что это не имеет никакого отношения к кастингу.Это происходит в методе viewWillAppear, где есть аналогичная вещь: UIView * popoverSuperview = ((UIPopoverController *) [super valueForKey: @ "_ hiddenPopoverController"]). ContentViewController.view.superview; Есть комментарий, что это часть взлома с исправлениями, что предполагает, что мне придется снимать все это и делать это по-другому. Опираясь на слишком много хаков, я не понимаю и продолжаю использовать устаревшие методы, казалось бы, плохой путь. – David

+0

авария не вызвана 'objc_msgSend' (' splitViewController: willHideViewController: withBarButtonItem: forPopoverController: '). библиотека 'IntelligentSplitViewController' использует личный ivar с именем' _hiddenPopoverController', но в iOS 10 он был удален. поэтому KVO вызывает неопределенную ошибку ключа. – langyanduan

 Смежные вопросы

  • Нет связанных вопросов^_^