我有一个分段控件,其中有两个单元格以编程方式定义。当我进入我的app,两个单元格执行相同的动作。第一个应该在Safari中打开一个网页,第二个打开一个图像并覆盖当前视图5秒。指针吗?
.m文件
@property UISegmentedControl *segment;
- (void)viewDidLoad
{
UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Publication", @"About", nil]];
self.tableView.tableHeaderView = segment;
[segment addTarget:self action:@selector(segmentPressed:) forControlEvents:UIControlEventValueChanged];
[self.tableView registerClass:[UITableViewCell class]
forCellReuseIdentifier:@"UITableViewCell"];
}
- (void)segmentPressed:(id)sender {
if (_segment.selectedSegmentIndex ==0) {
[[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"******"]];
}else if(_segment.selectedSegmentIndex ==1){
UIImageView *imageView = [[UIImageView alloc] initWithFrame: CGRectMake(0, 0, 320, 480)];
imageView.backgroundColor = [UIColor redColor];
[imageView setImage: [UIImage imageNamed:@"MACSLoad@2x.png"]];
[self.view addSubview: imageView];
sleep(5);
imageView.hidden = YES;
}
}
你得到这个结果是因为_segment是nil。您从未将创建的分段控件分配给属性,而是将其分配给局部变量。修改这一行
UISegmentedControl *segment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Publication", @"About", nil]];
self.segment = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"Publication", @"About", nil]];
另一种方法是,把这个属性全部去掉,让viewDidLoad的代码保持原样,然后改变这个
- (void)segmentPressed:(id)sender {
if (_segment.selectedSegmentIndex ==0) {
,
- (void)segmentPressed:(UISegmentedControl *)sender {
if (sender.selectedSegmentIndex ==0) {
除非您需要在其操作方法之外访问分段控件,否则没有理由创建该属性。在任何情况下,最好使用sender参数,而不是在操作方法中使用属性(即使您有一个属性)。