Цель с установкой объекта в класс, который не известен - PullRequest
0 голосов
/ 14 сентября 2011

У меня есть массив контроллеров представления (есть еще, что я показал):

..
settings = [[settingsSettingTab alloc] initWithNibName:@"settingsTab" bundle:nil];
other = [[otherSettingTab alloc] initWithNibName:@"otherTab" bundle:nil];
..

NSArray *views = [NSArray arrayWithObjects:settings,other, nil];

Затем я перебираю их и присваиваю им некоторые детали, прежде чем нажимать их:

for (int i = 0; i < views.count; i++) {
...
NSString *className = NSStringFromClass([[views objectAtIndex:i] class]);
Class myClass = NSClassFromString(className);

myClass *subView = (myClass*)[views objectAtIndex:i];

[self.scrollView addSubview:subView.view];
}

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

settingTab *subView = (settingTab*)[views objectAtIndex:i];

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

Спасибо

EDIT:

Вот весь код:

NSArray *titles = [NSArray arrayWithObjects: @"Basics", @"Colours", @"Shapes", @"Settings", @"Other", nil];

basics = [[basicsSettingTab alloc] initWithNibName:@"basicsTab" bundle:nil];
colours = [[colorsSettingTab alloc] initWithNibName:@"colorsTab" bundle:nil];
shapes = [[shapesSettingTab alloc] initWithNibName:@"shapesTab" bundle:nil];
settings = [[settingsSettingTab alloc] initWithNibName:@"settingsTab" bundle:nil];
other = [[otherSettingTab alloc] initWithNibName:@"otherTab" bundle:nil];

NSArray *views = [NSArray arrayWithObjects: basics,colours,shapes,settings,other, nil];

for (int i = 0; i < views.count; i++) {


    CGRect frame;
    frame.origin.x = self.scrollView.frame.size.width * i + 20;
    frame.origin.y = 0;

    CGFloat newWidth = 280;
    CGFloat newHeight = 320;
    CGFloat locx = 0;
    CGFloat locy = 0;

    CGRect panel = CGRectMake(locx, locy, newWidth, newHeight);

    frame.size = panel.size;//self.scrollView.frame.size;
    //subview.view.backgroundColor = [colors objectAtIndex:i];

    NSString *className = NSStringFromClass([[views objectAtIndex:i] class]);
    Class myClass = NSClassFromString(className);

    myClass *subView = (myClass*)[views objectAtIndex:i];
    [subView.view setFrame:frame];
    subView.tabTitle.text = [titles objectAtIndex:i];

    [subView.view.layer setCornerRadius:5.0f];
    [subView.view.layer setMasksToBounds:YES];

     subView.delegate = self;

    [self.scrollView addSubview:subView.view];
}

self.scrollView.contentSize = CGSizeMake(self.scrollView.frame.size.width * views.count, self.scrollView.frame.size.height);
pageControl.numberOfPages = views.count;

}

Ответы [ 3 ]

1 голос
/ 14 сентября 2011

Если все они являются подклассами UIViewController, просто используйте его:

****
frame.size = panel.size;//self.scrollView.frame.size;
//subview.view.backgroundColor = [colors objectAtIndex:i];

UIViewController* subView = (UIViewController*)[views objectAtIndex:i];

[subView.view setFrame:frame];
****

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

Надеюсь, это поможет:)

1 голос
/ 14 сентября 2011

Из ваших изменений мы видим, что у вас есть свойство tabTitle на каждом из ваших пользовательских контроллеров представления. Я бы порекомендовал вам создать новый подкласс UIViewController, который реализует tabTitle, и использовать его в качестве суперкласса для каждого из ваших пользовательских контроллеров. Таким образом, вашему коду нужно только знать, что все они являются классом MyTabViewController (из-за отсутствия лучшего имени класса!). Так что в вашем для цикла:

MyTabViewController *subview = (MyTabViewController *)[views objectAtIndex:i];
[subview.view setFrame:frame];
[subview.tabTitle setText:[titles objectAtIndex:i]];

// ...

[self.scrollView addSubview:subView.view];

Все остальное (например, view свойство) определяется UIViewController, от которого все ваши подклассы являются потомками.

EDIT

Кстати, я бы был осторожен с именами ваших объектов - ваши контроллеры вида не view s. В частности, это может привести к путанице, если у вас есть subview.view. Возможно, более подходящим будет subviewController.view или даже просто controller.view?

1 голос
/ 14 сентября 2011

Свойства, которые вы устанавливаете, являются общими для всех, поскольку все они наследуются от UIViewController.

заменить:

myClass *subView = (myClass*)[views objectAtIndex:i];

на:

UIViewController *subViewController = (UIViewController *)[views objectAtIndex:i];

Кроме того, будьте осторожны при взаимозаменяемом использовании терминов "view" и viewController.вещь и может стать очень запутанным / сложным, когда вы называете вещи, как они.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...