我有一个 NSButton 上传文件并解析响应。我想实现以下内容:当我点击按钮时,他上传文件并解析响应。当发生这种情况时,按钮标题应该从“上传”变为“取消”,当我在上传或解析时再次按下按钮时,解析或上传的过程应该停止。当该过程被取消或成功时,按钮标题应返回“上传”,如果我现在单击按钮,他应该再次开始上传和解析。我希望你能想象我的意思,英语不是我的母语;)
提前致谢
你可以有一个像这样的动作。
- (IBAction)btnAction:(id)sender {
NSButton *btn=(NSButton *)sender;
[btn setTitle:([btn.title isEqualToString:@"Upload"] ? @"Cancel" : @"Upload")];
if([btn.title isEqualToString:@"Upload"]){
//Do upload and parsing
}else{
//Cancel upload and parsing
}
}
所有控件都有一个目标和一个动作。目标通常是一些控制器对象。当你的目标的动作被调用时(比如-multiPurposeButtonClicked:
),你可以改变你的控制器的一些内部状态(可能是一个叫做 BOOL 的needsUpload
)并设置发送者的(按钮的)标题或者基于这个状态执行一些其他的活动。该方法可能会调用[self beginProcessingUpload]
或[self cancelTheWholeThing]
基于是否needsUpload == YES
. 当您的“上传完成”回调发生时,您可以重置控制器的状态并使用按钮的插座(也许IBOutlet NSButton * uploadButton;
)来重置标题。
如何处理这个问题真的取决于你。更具体的问题将得到更集中的答案。
为此,您必须在第一次按下按钮时创建一个新线程来上传和解析响应内容,然后更改按钮的标题,如果再次按下按钮,则销毁线程并恢复按钮的标题回来,还要确保,一旦线程完成,恢复按钮的状态。
** 要确定单击按钮时应采取什么操作,只需测试线程的句柄以查看它是否为 nil,如果是,则创建一个新线程,否则终止并设置为 nil。(不要忘记设置为零开始)。
您可以将 NSButton 的操作重新分配给替代选择器。假设您有两个选择器:upload:(id)sender
和cancel:(id)sender
.
最初设置您的 NIB 以调用upload:
选择器。在upload:
选择器中,您可以使用插座(如 Joshua 所述)来更改按钮的标题以取消,然后更改操作:
- (IBAction)upload:(id)sender {
[uploadButton setTitle:@"Cancel"];
SEL cancelSelector = @selector(cancel:);
[uploadButton setAction:cancelSelector];
// Carry out upload actions
}
在cancel:
选择器中,您可以将它们设置回原来的样子:
- (IBAction)cancel:(id)sender {
[uploadButton setTitle:@"Upload"];
SEL uploadSelector = @selector(upload:);
[uploadButton setAction:uploadSelector];
// Carry out cancel actions
}
您当然必须添加额外的处理才能考虑在上传完成后将“上传”按钮重新设置。