0

プログラムで定義された 2 つのセルを持つセグメント化されたコントロールがあります。アプリに入ると、両方のセルが同じアクションを実行します。1 つ目は Safari で Web ページを開き、2 つ目は画像を開いて現在のビューを 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;

        }


    }
4

1 に答える 1

2

_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 引数を使用することをお勧めします (プロパティがある場合でも)。

于 2014-06-27T00:38:57.910 に答える