2013-07-11 8 views
0

У меня есть этот код, который устанавливает подзону в представление определенного ViewController на основе того, какой параметр выбран в виде таблицы. Вот код:Перезагрузка объекта Subview C

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]]; 
    [self setCurrentViewController:[indexPath row]]; 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

Код, который первоначально добавляет подвид выглядит следующим образом:

[self setMainView:[[[self controllerArray] objectAtIndex:0] view]]; 
[[self view] addSubview:[self mainView]] 

Проблема заключается в том, что код, который изменяет подвид не обновляет подвид поэтому зрения фактически никогда не грузы. Я могу перезагрузить представление, удалив его из подвью ([[self mainView] removeFromSuperview]), но это заставляет его загружать обратно в центр. Подвью может перемещаться в зависимости от жестов пользователя, и я хотел бы сохранить его в одном месте. Есть ли способ перезагрузить subview или мне нужно отслеживать, где находится subview, а затем установить его после удаления и повторного добавления.

EDIT: Интересная заметка: Этот код работает отлично (вид остается на предыдущей координате):

[[self mainView] removeFromSuperview]; 
[self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]]; 
[[self view] addSubview:[self mainView]]; 
[self setCurrentViewController:[indexPath row]]; 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 

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

+0

Что вы подразумеваете под «перезагрузкой»? –

+0

Вы должны реализовать метод layoutSubviews на представлении контроллера вида и вызвать '[self.view layoutIfNeeded]', чтобы перенастроить положение всех ваших подзонов. – Eimantas

+0

@JustinMeiners Представление автоматически не обновляется до нового представления (оно все еще показывает старое представление после того, как я установил его на новый). Есть ли способ обновить его. – carloabelli

ответ

0

Означает ли это, что проблема?

[[self mainView] removeFromSuperview]; 
[self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]]; 
[self addSubview:[self mainView]]; 
[self setCurrentViewController:[indexPath row]]; 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 

EDIT1: Если это просто позиция, которую вы хотите сбросить, вы можете добавить свойство CGRect originalFrame и в коде, где вы добавили подтаблицы добавить:

[self setMainView:[[[self controllerArray] objectAtIndex:0] view]]; 
[[self view] addSubview:[self mainView]]; 
self.originalFrame = [self mainView].frame; 

и тогда, когда вы хотите сбросить использование положения:

[[self mainView] setFrame:self.originalFrame]; 

EDIT2: Может быть, это было бы достаточно, чтобы использовать «скрытое» свойство взглядов? Таким образом, вы можете сохранить их все как подобозрения сразу, но сделать только один видимым, как этот

[self mainView].hidden = YES; 
[self setMainView:[[[self controllerArray] objectAtIndex:[indexPath row]] view]]; 
[self mainView].hidden = NO; 
[self setCurrentViewController:[indexPath row]]; 
[tableView deselectRowAtIndexPath:indexPath animated:YES]; 

Не забудьте добавить все подвиды при старте, и множество скрытых на них ДА, для представления вы хотите, за исключением быть видимым первым.

+0

Спасибо за попытку, но, как указано в вопросе, я знаю, что могу это сделать, но мне нужен более быстрый метод и один с меньшим кодом (мне пришлось бы сбросить координаты вида) – carloabelli

+0

Отредактирован ответ. Это то, что вам нужно? – johnyu

+0

Опять же, спасибо за попытку, но я знаю, как установить позицию. Мне интересно решение, которое занимает меньше времени (требуется некоторое время, чтобы удалить и добавить subview) – carloabelli

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