Куда добавить 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"];
}
}