0

我试图子类化UISegmentedControl.
我正在NSArray从视图中传递一个并尝试为UISegmentedControlfrom that设置标题NSArray
我使用了该initWithArray方法,但它没有从数组中设置值。

这是我的子类UISegmentedControl

WTSegmentedControl.h

@interface WTSegmentedControl : UISegmentedControl {

}
@end

WTSegmentedControl.m

#import "WTSegmentedControl.h"

@implementation WTSegmentedControl

- (id)initWithItems:(NSArray *)items {
    if (self = [super initWithItems:items]) {

    }
    return self;
}

现在从我的观点来看,我正在调用这个方法。

我已经像这样连接了插座:

@property (nonatomic,strong) IBOutlet WTSegmentedControl  *control;

- (void)viewDidLoad {
    NSArray *names = [[NSArray alloc] initWithObjects:@"yes", @"no", nil];
    control = [[WTSegmentedControl alloc] initWithItems:names];
}

NSArray正确通过titles但未设置。

谁能帮我解决这个问题?

4

2 回答 2

1

好的,所以您是在 Interface Builder 中或通过代码创建控件!?你不能两者都做。如果要在代码中创建它,请删除IBOutlet属性中的部分并在初始化后将控件添加到 subView:

// adding the control by code
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *names = [[NSArray alloc] initWithObjects:@"yes", @"no", nil];
    control = [[WTSegmentedControl alloc] initWithItems:names];
    control.frame = CGRectMake(x,z,width,height);
    [self.view addSubview: control];
}

但是如果你想在 InterfaceBuilder 中创建它,你不应该重新初始化它。在 Interface Builder 中设置您的自定义类,然后像这样设置标题:

// using Interface Builder
- (void)viewDidLoad
{
    [super viewDidLoad];

    NSArray *names = [[NSArray alloc] initWithObjects:@"yes", @"no", nil];
    [names enumerateObjectsUsingBlock:^(NSString *title, NSUInteger idx, BOOL *stop) {
        [control setTitle:title forSegmentAtIndex:idx];
    }];
}
于 2013-04-23T09:02:08.567 回答
0

如果您已正确连接您的 IBOutlet 控件,则此时会自动设置控件变量。这是在加载视图时完成的。所以这一行:

control = [[WTSegmentedControl alloc] initWithItems:names];

应该改成这样:

[control initWithItems:names];
于 2013-04-23T09:02:06.577 回答