Куда добавить UISegmentedController; loadView, initWithNibName: bundle: или viewDidLoad?

Я только начинаю программировать на Objective-C, и меня немного смущает вопрос о том, где объявить UISegmentedController экземпляр как "подпредставление" моего viewController корневой вид.

Я экспериментировал с кодом, и он, кажется, работает независимо от того, создан ли он в "loadView", viewDidLoad, или же initWithNibName: bundle: и мне интересно, почему это так, а также где будет правильное место для его создания.

Все представления в иерархии были созданы программно.

Код:

UISegmentedControl код, который я не уверен, где разместить:

self.segCon = [[UISegmentedControl alloc] 
initWithItems:(NSArray *)@[@"Red",@"Green", @"Blue"]];

self.segCon.frame = CGRectMake(35, 200, 250, 50);

[self.segCon addTarget:self
                action:@selector(changeColor:)
      forControlEvents:UIControlEventValueChanged];
[self.view addSubview:self.segCon];

BNRHypnosisViewController.m:

#import "BNRHypnosisViewController.h"
#import "BNRHypnosisView.h"

@interface BNRHypnosisViewController()

@property (strong, nonatomic) UISegmentedControl *segCon;

- (void)changeColor:(id)sender;

@end

@implementation BNRHypnosisViewController

-(void)loadView
{
    //create a view
    BNRHypnosisView *backgroundView = [[BNRHypnosisView alloc] init];

    //set it as *the* view of this view controller
    self.view = backgroundView;

Я помещаю UISegmentedControl код здесь?

}

-(instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if (self) {
        //Set the tab bar items title
        self.tabBarItem.title = @"Hypnotize";

        //Create a UIImage from the file
        // This will use Hypno@2x.png on retina devices
        UIImage *i = [UIImage imageNamed:@"Hypno.png"];

        //put the image on the tab bar
        self.tabBarItem.image = i;

или здесь?

    }

    return self;
}    

-(void)viewDidLoad
{
    //Always call the super implementation of viewdidload
    [super viewDidLoad];

    NSLog(@"BNRHypnosisViewController loaded its view");

или здесь?

}

- (void)changeColor:(id)sender
{
    NSLog(@"The Segment controller was touched %d", self.segCon.selectedSegmentIndex);
    if(self.segCon.selectedSegmentIndex == 0){
    ((BNRHypnosisView *)self.view).circleColor = [UIColor redColor];
    }
    if(self.segCon.selectedSegmentIndex == 1){
    ((BNRHypnosisView *)self.view).circleColor = [UIColor greenColor];
    }
    if(self.segCon.selectedSegmentIndex == 2){
    ((BNRHypnosisView *)self.view).circleColor = [UIColor blueColor];
    }

}


@end    

Любая помощь будет принята с благодарностью, заранее спасибо за ваш отзыв!

2 ответа

Решение

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

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

Я думаю, что наилучшей практикой является сохранение памяти, используемой вашим приложением в любой момент времени, без создания экземпляров ничего ненужного. Другими словами, как сказал @rmaddy, вы не хотите вызывать метод в init метод вашего контроллера представления, который преждевременно создает представление, в котором пользователь не нуждается, и поэтому занимает ценную память в куче. следуя этой предпосылке, вы не должны ошибаться. Хороший пост, кстати. Я следую за той же книгой Big Nerd Ranch, и это отличный учебный инструмент для любого новичка, просматривающего это! Примечание, я вижу, вы изменили UIColor circleColor; от расширения класса до публичной собственности в BNRHypnosisView.h, вы можете сохранить его расширение класса и по-прежнему установить _circleColor переменная экземпляра в вашем - (void)changeColor:(id)sender метод с использованием кодирования значения ключа следующим образом:

    - (void)changeColor:(id)sender
{
    NSLog(@"The segment controller was touched %d", self.colorSwitch.selectedSegmentIndex);
    if (self.colorSwitch.selectedSegmentIndex == 0) {
        [self.view setValue:[UIColor redColor] forKeyPath:@"circleColor"];
    } else if (self.colorSwitch.selectedSegmentIndex == 1) {
        [self.view setValue:[UIColor greenColor] forKeyPath:@"circleColor"];
    } else if (self.colorSwitch.selectedSegmentIndex == 2) {
        [self.view setValue:[UIColor blueColor] forKeyPath:@"circleColor"];
   }
}
Другие вопросы по тегам