UISegmentedControl регистрируют касания на выбранном сегменте

Удобство Управления. От BeginInvoke () трудно отказаться. Вы не имеете к. Добавьте новый класс к своему проекту и вставьте этот код:

using System;
using System.Threading;
using System.Windows.Forms;

public partial class frmWorker : Form {
  public frmWorker() {
    // Start the worker thread
    Thread t = new Thread(new ParameterizedThreadStart(WorkerThread));
    t.IsBackground = true;
    t.Start(this);
  }
  public void Stop() {
    // Synchronous thread stop
    this.Invoke(new MethodInvoker(stopWorker), null);
  }
  private void stopWorker() {
    this.Close();
  }
  private static void WorkerThread(object frm) {
    // Start the message loop
    frmWorker f = frm as frmWorker;
    f.CreateHandle();
    Application.Run(f);
  }
  protected override void SetVisibleCore(bool value) {
    // Shouldn't become visible
    value = false;
    base.SetVisibleCore(value);
  }
}

Вот некоторый пример кода для тестирования его:

  public partial class Form1 : Form {
    private frmWorker mWorker;
    public Form1() {
      InitializeComponent();
      mWorker = new frmWorker();
    }

    private void button1_Click(object sender, EventArgs e) {
      Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
      mWorker.BeginInvoke(new MethodInvoker(RunThisOnThread));
    }
    private void RunThisOnThread() {
      Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId);
    }

    private void button2_Click(object sender, EventArgs e) {
      mWorker.Stop();
    }
  }
61
задан Pieter Jongsma 25 October 2009 в 13:51
поделиться

4 ответа

Вы можете создать подкласс UISegmentedControl , а затем переопределить setSelectedSegmentIndex:

- (void) setSelectedSegmentIndex:(NSInteger)toValue {
    if (self.selectedSegmentIndex == toValue) {
        [super setSelectedSegmentIndex:UISegmentedControlNoSegment];
    } else {
        [super setSelectedSegmentIndex:toValue];        
    }
}

При использовании IB убедитесь, что вы установили класс своего UISegmentedControl для своего подкласса.

Теперь вы можете прослушивать тот же UIControlEventValueChanged , как обычно, за исключением того, что если пользователь отменил выбор сегмента, вы увидите selectedSegmentIndex , равный UISegmentedControlNoSegment :

-(IBAction) valueChanged: (id) sender {
    UISegmentedControl *segmentedControl = (UISegmentedControl*) sender;
    switch ([segmentedControl selectedSegmentIndex]) {
        case 0:
            // do something
            break;
        case 1:
            // do something
            break;
        case UISegmentedControlNoSegment:
            // do something
            break;
        default:
            NSLog(@"No option for: %d", [segmentedControl selectedSegmentIndex]);
    }
}
51
ответ дан 24 November 2019 в 17:06
поделиться

Я хотел это. Взял решение Джулиана (спасибо!) И немного изменил.

Следующий подкласс UISegmentedControl просто запускает событие UIControlEventValueChanged , даже если значение не изменилось, что, очевидно, выглядит немного странно, но в моем случае работает нормально и упрощает работу.

AKSegmentedControl.h

#import <UIKit/UIKit.h>

@interface AKSegmentedControl : UISegmentedControl {
}

@end

AKSegmentedControl.m

#import "AKSegmentedControl.h"

@implementation AKSegmentedControl

- (void)setSelectedSegmentIndex:(NSInteger)toValue {
  // Trigger UIControlEventValueChanged even when re-tapping the selected segment.
  if (toValue==self.selectedSegmentIndex) {
    [self sendActionsForControlEvents:UIControlEventValueChanged];
  }
  [super setSelectedSegmentIndex:toValue];        
}

@end
17
ответ дан 24 November 2019 в 17:06
поделиться

Первой моей идеей было подключить действия Touch Up Inside или Touch Down к вашему методу сортировки, но это не похоже работа.

Вторая идея - это скорее обходной путь, установка свойства Momentary для сегментированного элемента управления. После этого будет запускаться действие Value Did Change при каждом касании.

1
ответ дан 24 November 2019 в 17:06
поделиться

Большая помощь! Что я хочу сделать, так это выбрать одну или не установить ни одной кнопки - и когда кнопка установлена, второе нажатие отключает ее. Это моя модификация:

- (void)setSelectedSegmentIndex:(NSInteger)toValue
{
  // Trigger UIControlEventValueChanged even when re-tapping the selected segment.
  if (toValue==self.selectedSegmentIndex) {
    [super setSelectedSegmentIndex:UISegmentedControlNoSegment]; // notify first
    [self sendActionsForControlEvents:UIControlEventValueChanged]; // then unset
  } else {
    [super setSelectedSegmentIndex:toValue]; 
  }
}

Notify first позволяет вам прочитать элемент управления, чтобы найти текущую настройку перед ее сбросом.

1
ответ дан 24 November 2019 в 17:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: