在哪里添加UISegmentedController; loadView,initWithNibName:bundle:或viewDidLoad?

时间:2014-05-18 16:13:19

标签: ios objective-c uisegmentedcontrol viewdidload loadview

我刚刚开始使用Objective-C编程,我对将UISegmentedController实例声明为"子视图"的位置感到有些困惑。我的viewController根视图。

我一直在尝试使用该代码,无论是否在" loadView",viewDidLoadinitWithNibName: 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    

非常感谢任何帮助,请提前感谢您的反馈!

2 个答案:

答案 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"];
   }
}