0

Приведенный ниже метод вызывается неосновного потока, чтобы быть конкретным, в очереди обратного вызова записи аудиоsetNeedsDisplay представлен на главной очереди, но не называется

- (void)myMethod 
{ 
//... 
dispatch_async(dispatch_get_main_queue(), ^{ 
    [myGraphView setNeedsDisplayInRect:CGRectMake(a, b, c, d)]; 
    NSLog(@"Block called"); 
}); 
//... 
} 

, где myGraphView является объектом пользовательских UIView. Для чего я знаю, setNeedsDisplayInRect: должен быть вызван в главной теме, поэтому у меня есть dispatch_async... на месте. Теперь проблема заключается в методе - (void)drawRect:(CGRect)rect Я реализовал для myGraph никогда не вызывается, хотя NSLog в блоке вызывается много раз.

ответ

1

Здесь есть несколько возможностей.

Из класса Reference:

Примечание: Если ваша точка зрения опирается на объект CAEAGLLayer, этот метод имеет никакого эффекта. Он предназначен для использования только с представлениями, которые используют собственные технологии рисования (например, UIKit и Core Graphics) для отображения их содержимого .

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

+0

Я выполнил вашу вторую возможность, но я обнаружил, что проблема была вызвана третьей возможностью того, что представление, которое я хотел обновить, никогда не было добавлено в его супервизор (таким образом, его никогда не отображали). Но ваш ответ заставил меня узнать ошибку в моем коде. Благодаря! –

+0

Если вы нашли решение, разместите его, чтобы другие могли узнать из вашего опыта. – Holly

0

Благодаря ответу @ Neal, который заставил меня узнать, что myGraphView был, после того, как он был назначен в первый раз, повторно назначил. Однако, в отличие от первого alloc-init, после которого я добавил myGraphView в свой супервизор, я забыл сделать это после второго alloc-init.

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

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

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