2012-07-25 3 views
0

У меня есть кнопка UIBarButtonItem *. Идея заключается в том, что пользователь нажимает кнопку, а затем появляется окно. Это объявлен в целевой/действие кнопки (т.е. нажав кнопку вызываетUIBarButtonItem: кадр, обработанный по-разному для вызова целевого действия против выполнения. Выбор: withObject:

(void)showMyWindow:(id)sender 

, где отправителем является UIBarButtonItem

В showMyWindow:. Метод, рисунок во всплывающем окне требуется кадр отправителя. Теперь UIBarButtonItem обычно не позволяет вам получить доступ к его фрейму. В качестве части хака я отправил отправителя в UIView, а затем обратился к этому фрейму UIView. Я не думал, что это будет работа, но, на удивление, это так.

Однако я также хочу вызвать метод showMyWindow: в другом месте. Поэтому у меня есть эта строка кода:

[self performSelector:@selector(showMyWindow:) withObject:self.button]; 

Здесь мое приложение падает. Я подсказала проблему именно к этому:

(void)showMyWindow:(id)sender 
{ 
    //I should be checking before the cast here, but it helps illustrate the problem 
    UIView *senderAsView = (UIView *)sender 
    CGRect frame = senderAsView.frame; 
    ... 
} 

Суть в том, что я могу как-то выполнить этот бросок + доступ к кадру, когда я вызываю метод с целевыми действиями, но не тогда, когда я использую performSelector: withObject:

Почему существует разница? Почему это действие может быть выполнено в одном случае, но не в другом?

Спасибо.

+0

Что вы видите, и что такое информация? Это элемент кнопки? – jrturton

+0

Извините - я изменил на более общее именование и пропустил этот экземпляр (отредактировал informationButton to button). У меня нет проекта, но он был «непризнанным селектором, посланным экземпляру ...» в строке getFrame, я считаю. Я могу уточнить позже. –

+0

Вот как я догадался, я пошел вперед и все равно ответил ... – jrturton

ответ

1

Как немного взломать, я отправил отправителя в UIView, а затем обратился к этому фрейму UIView. Я не думал, что это сработает, но это удивительно.

UIBarButtonItem происходит от NSObject, а не UIView, и не имеет свойства кадра. Отправитель в этом случае, скорее всего, не элемент вашей кнопки, а либо принадлежащий ему частный вид (если вы используете системный элемент), либо его собственное свойство представления.

Когда вы называете это «вручную» вы действительно являются отправки экземпляра UIBarButtonItem, который не имеет рамки, и будет врезаться, когда вы приводите его к UIView и попросить его свойства фрейма.

Вы можете уточнить, что действительно отправляется, исследуя объект sender в отладчике. Это будет подкласс представления в первом экземпляре и UIBarButtonItem (или подкласс) во втором.

+0

Отличный ответ. Это имеет смысл. Спасибо за помощь. –