我刚刚开始使用Objective-C编程,我对将UISegmentedController
实例声明为"子视图"的位置感到有些困惑。我的viewController
根视图。
我一直在尝试使用该代码,无论是否在" loadView",viewDidLoad
或initWithNibName: bundle:
和I'中创建它,它似乎都能正常工作。我想知道为什么会这样,以及创造它的正确位置。
层次结构中的所有视图都是以编程方式创建的。
代码:
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
非常感谢任何帮助,请提前感谢您的反馈!
答案 0 :(得分:2)
我通常将这些代码放在viewDidLoad
中。但由于您需要实现loadView
,因此可以在那里设置分段控件。
不要在init...
方法中执行此操作,因为您最终会不必要地从init...
方法加载视图。
答案 1 :(得分:0)
我认为最佳做法是通过不实例化不需要的任何内容来节省应用程序在任何给定时间使用的内存。换句话说,正如@rmaddy所说,你不想在视图控制器的init
方法中调用一种方法,这种方法会过早地创建一个用户不需要的视图,因此需要堆上有价值的内存。遵循这个前提,你不应该出错。顺便说一下btw。我跟随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"];
}
}