#iphone #ios #uiscrollview
#iPhone #iOS #uiscrollview
Вопрос:
У меня есть приложение на основе вкладок, над которым я работаю.
У меня есть контроллер представления с именем DetailsView.m и сопутствующим файлом nib с именем DetailsView.xib. В нем есть пара UILabels, которые связаны с помощью IBOutlet с контроллером просмотра DetailsView.m. Когда я загружаю этот контроллер представления с помощью контроллера панели вкладок, он работает нормально, и UILabels заполняются динамически.
Теперь я хочу загрузить все это представление внутрь UIScrollView, чтобы вместо этого я мог разместить больше содержимого.
Итак, я создал другой контроллер представления с именем DetailsHolder.m с файлом nib с именем DetailsHolder.xib и назначил его контроллеру панели вкладок.
Я написал этот код ниже, чтобы загрузить первое представление (DetailsView) в UIScrollView во втором представлении (DetailsHolder). Я написал это в методе viewDidLoad DetailsHolder:
DetailsView* detailsView = [[DetailsView alloc] initWithNibName:@"DetailsView" bundle: nil];
CGRect rect = detailsView.view.frame;
CGSize size = rect.size;
[scrollView addSubview: detailsView.view];
scrollView.contentSize = CGSizeMake(320, size.height);
Это корректно загружает вспомогательный вид в UIScrollView, однако метки внутри DetailsView больше ничего не делают. Когда я помещаю NSLog в viewDidLoad из DetailsView — он никогда ничего не регистрирует. Это как если бы я загрузил перо нормально, но оно больше не связано с контроллером представления. Чего мне здесь не хватает? Я немного новичок в obj C / iOS (но обладаю многолетними знаниями Actionscript / Javascript.
Заранее спасибо,
Богатый
Редактировать: содержимое DetailsView в соответствии с запросом:
DetailsView.h:
#import <UIKit/UIKit.h>
#import "AppModel.h"
@interface DetailsView : UIViewController {
IBOutlet UITextView* textView;
IBOutlet UIImageView* imageView;
}
@end
DetailsView.m
#import "DetailsView.h"
@implementation DetailsView
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)dealloc
{
[super dealloc];
}
- (void)didReceiveMemoryWarning
{
// Releases the view if it doesn't have a superview.
[super didReceiveMemoryWarning];
// Release any cached data, images, etc that aren't in use.
}
#pragma mark - View lifecycle
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view from its nib.
}
- (void)viewWillAppear:(BOOL)animated
{
AppModel* model = [AppModel sharedInstance];
[model loadData];
int selectedLocation = [model getSelectedLocation];
NSArray *locations = [model getLocations];
NSArray *data = [locations objectAtIndex:selectedLocation];
textView.text = [data objectAtIndex: 0];
UIImage *theImage = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[data objectAtIndex: 4] ofType:@"jpg"]];
imageView.image = theImage;
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
// e.g. self.myOutlet = nil;
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
// Return YES for supported orientations
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
По сути, все, что он делает, — это извлекает selectedLocation (int) из синглтона (который является моей моделью), затем извлекает массив из модели, а затем пытается вставить изображение и некоторый текст в мое представление. В моем файле nib у меня есть UIImageView и UITextView, которые я связал с двумя IBOutlets, объявленными в DetailsView.h
Ответ №1:
Когда вы используете контроллер представления подобным образом, многие события не будут происходить в контроллере представления, например viewWillAppear, viewWillDisappear и событие поворота устройства. Я предполагаю, что вы выполнили некоторую инициализацию в некоторых из этих методов событий. Публикация вашего кода для DetailsView
упростила бы поиск проблемы.
Комментарии:
1. Большое спасибо, Тиа. Я отредактировал исходное сообщение, чтобы включить представление «Источник сведений» в соответствии с запросом.
2. Теперь ясно, что у вас есть
viewWillAppear
метод, который не будет выполнен. Вы могли бы исправить это, вызвав его непосредственно перед добавлением в scrollview.