Я получаю странное поведение с subviews UIScrollView
, идея состоит в том, чтобы создать программно экземпляр UIView
с настраиваемым файлом nib, который является формой в моем случае, заполните эту форму данными из класс модели, и добавьте его как subview для моего UIScrollView
. Проблема заключается в том, что когда я занимаюсь более чем одним подвью, UIScrollView
поддерживает только самое последнее subview, поэтому, если бы я создал три подзаголовка, scrollview покажет только третье (последнее) подвью. Несмотря на то, что элемент управления страницы установлен на число ячеек подложек (три).scrollview показывает только последний добавленный subview
Проект слишком долго, поэтому я попытаюсь объяснить brievely мою проблему с отношение код:
- (void)viewDidLoad {
NSArray *sorted = [appArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];//this array contains the data from model, I debugged that to make sure I got the exact data, no more no less :)
//Loop all NSManaged objects, for example let's say I have 3 model objects, don't worry about how I get data etc, because I debugged all and maked sure all data objects number are exact, etc.
for (App_Table *_appTable in sorted) {
//This looped 3 times as expected, I debugged that also and maked sure on each iteration I got the data I expected to have
//App_Table is a subclass of NSManagedObject, it's my model class and get its data from coredata file
[self addMoreView];//Call this method will create a new subview and add it as subview to the UIScrollView, it will also update the page control, update the content size property, etc.
AppTableView *_appTableView = (AppTableView *) [[self.scrollView subviews] lastObject];//Remember addMoreView method create a new instance of AppTableView and add it as subview for the UIScrollView property, then I get that subview to fill it with data here
_appTableView.txtADDRESS.text = _appTable.address;//Fill in the form, no need to write all the form fields code because it's the same way.
// Scroll To First Page...
self.pageControl.currentPage = 0;
[self.scrollView scrollRectToVisible:CGRectMake(0, 0, viewWidth, viewHeight) animated:YES];
self.scrollView.contentSize = CGSizeMake(viewWidth*noOfItems, viewHeight);//Set the content size to the sum of subviews width, I also debugged that to check it's correct
self.scrollView.delegate = self;
[super viewDidLoad];
}
Итак, когда у меня есть три подвидов, то Scrollview загрузит с шириной три подвиды, рассчитанные с помощью данной линии:
self.scrollView.contentSize = CGSizeMake(viewWidth*noOfItems, viewHeight);//Set the content size to the sum of subviews width, I also debugged that to check it's correct
и я могу прокрутить до 3 ходов (это число подвидов) и UIPageControl
также устанавливается в трех точках, но только ONE видна видимость, только последняя, которую я вижу, две другие области обзора исчезли, прокрутка отображает размер содержимого для них, но они не видны. Есть предположения ? Thanx.
EDIT:
Стоит отметить, что в первый раз, когда я изменить вид, все идет хорошо, когда я имею дело с 3-х подвидов, все они видны, но когда я иду к другой точке зрения и получить Вернемся к этому представлению, только последнее подвью видимо.
Кроме того, я работаю над проектом для iPad с разделенным представлением.
EDIT: Это код метода, который начертить новый подвид для UIScrollView
-(IBAction) addMoreView
{
NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"AppTableView" owner:self options:nil];
AppTableView *aView = [arr objectAtIndex:0];
[aView setFrame:CGRectMake(startX, 0, aView.bounds.size.width, aView.bounds.size.height)];
[self.scrollView addSubview:aView];
self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width+aView.frame.size.width
, self.scrollView.contentSize.height);
startX = startX + aView.frame.size.width;//Update the X position, first 0, then 600, 1200, and so on.
[self.scrollView scrollRectToVisible:aView.frame animated:YES];
NSLog(@"%f",self.scrollView.contentSize.width);
NSLog(@"%f",self.scrollView.contentSize.height);
}
Пусть у меня есть 3 подвидов, метод выше будет называться 3 раза, так как она помещается внутри for
петля. Так вот результат NSLogs
для приведенного выше метода:
NSLog(@"%f",self.scrollView.contentSize.width);
NSLog(@"%f",self.scrollView.contentSize.height);
First iteration:
600.000000
0.000000
Second iteration:
1200.000000
0.000000
Third iteration:
1800.000000
0.000000
EDIT:
Команда предложил ограбить mayoff позволяет мне понять, почему это произошло:
| | | | <AppTableView: 0x1eef4700; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 990; layer = <CALayer: 0x1eef4790>>
| | | | <AppTableView: 0x1ee3f380; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 991; layer = <CALayer: 0x1ee3f410>>
| | | | <AppTableView: 0x1ee56910; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 992; layer = <CALayer: 0x1ee3f410>>
Все три subviews рисуются в одном и том же фрейме, поэтому они находятся друг над другом, но когда я отлаживаю это с помощью контрольных точек во время выполнения, x
меняется, первый раз 0, затем 600, а затем 1200, что заставляет меня думать, что это d правильно загрузиться. Как исправить это, особенно если значение x будет увеличиваться правильно, так что в чем проблема и почему они все еще используют одну и ту же координату x?
Когда вы говорите, «перейти к другой точке зрения и вернуться к этой точке зрения», как эта точка зрения восстанавливается? Я предполагаю, что это не так; что '-viewDidLoad' вызывается только в первый раз, и проблема находится где-то еще в вашем коде. –
Да, он перестраивается, потому что, когда я выхожу из этого представления, данные сохраняются в модели, а затем, когда я возвращаюсь, данные извлекаются, а подпрограммы перестраиваются. То, что вы имеете в виду '-viewDidLoad, вызывается только до первого раза, я проверил с точками останова, и' viewDidLoad' всегда вызывается при доступе к представлению. – Malloc
Хорошо, тогда, если вы получаете другой результат в разных вызовах '-viewDidLoad', что меняется между двумя вызовами? –