Удобство Управления. От 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();
}
}
Вы можете создать подкласс 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]);
}
}
Я хотел это. Взял решение Джулиана (спасибо!) И немного изменил.
Следующий подкласс 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
Первой моей идеей было подключить действия Touch Up Inside
или Touch Down
к вашему методу сортировки, но это не похоже работа.
Вторая идея - это скорее обходной путь, установка свойства Momentary
для сегментированного элемента управления. После этого будет запускаться действие Value Did Change
при каждом касании.
Большая помощь! Что я хочу сделать, так это выбрать одну или не установить ни одной кнопки - и когда кнопка установлена, второе нажатие отключает ее. Это моя модификация:
- (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 позволяет вам прочитать элемент управления, чтобы найти текущую настройку перед ее сбросом.