Новый экземпляр UIViewController в другом UIViewController: Почему я не могу установить переменную экземпляра? - PullRequest
2 голосов
/ 27 июня 2011

Итак, у меня есть подкласс UIViewController с именем MyTabBarViewController, который имеет UIScrollView.Внутри MyTabBarViewController я создаю экземпляр другого подкласса UIViewController под названием PhotoViewController.(Примечание: я делаю это, чтобы настроить IBOutlets с помощью IB)

Я пытаюсь установить метку каждого экземпляра PhotoViewController из моего TabBarViewController.И я начинаю с nib для каждого PhotoViewController, поэтому у меня сложилось впечатление, что каждый экземпляр PhotoViewController будет подключен к их соответствующим IBOutlets - что позволяет мне просто установить имя метки, используя pvc.label.text = @ "текст, который я хочу".

Не могли бы вы объяснить, почему моя логика неверна?Потому что это не работает и не совсем уверен, что делать.: - /

MyTabBarViewController.m

#import "MyTabBarViewController.h"


@implementation MyTabBarViewController
@synthesize pageControl,scroller;

-(IBAction)clickPageControl:(id)sender
{
    int page=pageControl.currentPage;
    CGRect frame=scroller.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    [scroller scrollRectToVisible:frame animated:YES];
}

-(void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
    int page = scrollView.contentOffset.x/scrollView.frame.size.width;
    pageControl.currentPage=page;
}

- (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];
    scroller.delegate=self;
    scroller.pagingEnabled=YES;
    scroller.directionalLockEnabled=YES;
    scroller.showsHorizontalScrollIndicator=NO;
    scroller.showsVerticalScrollIndicator=NO;
    scroller.contentSize=CGSizeMake(pageControl.numberOfPages*scroller.frame.size.width, scroller.frame.size.height);
    CGFloat scrollWidth = 0;
    int pageNumber = 0;
    for (int i=0; i<3; i++)
    {
        PhotoViewController *pvc = [[PhotoViewController alloc] initWithNibName:@"PhotoViewController" bundle:nil];
        CGRect rect = scroller.frame;
        rect.size.height = scroller.frame.size.height;
        rect.size.width = scroller.frame.size.width;
        rect.origin.x = scroller.frame.origin.x + scrollWidth;
        rect.origin.y = scroller.frame.origin.y;
        pvc.label.text = [NSString stringWithFormat:@"%d", pageNumber];
        pvc.label.textColor = [UIColor redColor];
        pvc.view.frame  = rect;
        [scroller addSubview:pvc.view];
        [pvc release];
        pageNumber++;
        scrollWidth += scroller.frame.size.width;
    }
    pageControl.numberOfPages=3;
    pageControl.currentPage=0;
    [self.view addSubview:scroller];
}

- (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

PhotoViewController.h довольно прост.И PhotoViewController.m тоже есть, но я включил файл реализации на тот случай, если моя проблема там.

PhotoViewController.m

#import "PhotoViewController.h"


@implementation PhotoViewController
@synthesize label, imageView, sendButton, cancelButton;

- (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)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

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

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

Поскольку вы не можете установить значение любого уровня до viewDidLoad любого контроллера представления. Что вынужно, вам нужно соответственно установить свойства строкового типа для меток и установить их значения в MyTabBarViewController, затем из стека выбрать объект класса MyTabBarViewController в PhotoViewController, а затем получить доступ к его свойствам и установить ваши метки.

Для выбораДля просмотра объекта из стека необходимо использовать эту строку

MyTabBarViewController *obj = (MyTabBarViewController *)[self.navigationController.viewControllers objectAtIndex: [self.navigationController.viewControllers count]-2];
1 голос
/ 27 июня 2011

Объекты IBOutlet не существуют до viewDidLoad, и это обычно не происходит, пока вы не инициируете шоу.Следовательно, в MyTabBarViewController вы обращаетесь к метке и т. Д., Которой не существует.(Конечно, Objective-C удобно игнорирует вызовы на нулевых указателях, поэтому кажется, что все работает - просто ничего не происходит.)

В соответствии со спецификацией, вы можете инициировать загрузку, ссылаясь на свойство viewконтроллер представления, но я никогда не пробовал это.

...