限制NSTextField的输入

一个比较笨的方法----限制NSTextField的输入。

基本思路:取得当前输入的字符,如果不满足条件,就在NSTextField中将当前输入删除。

-(void)textFieldNotAllowedInput:(NSTextField*)textField inString:(NSString*)inString atIndex:(int)atIndex
{
NSRange rangeFirst =NSMakeRange(0, atIndex -1);
NSString* strFirst = [inString substringWithRange:rangeFirst];
NSRange rangeLast =NSMakeRange(atIndex, [inString length]-atIndex);
NSString* strSec = [inString substringWithRange:rangeLast];
[textField setStringValue:@""];
NSString* strInputTemp = @"";
[textField setStringValue:[strInputTemp stringByAppendingString:strFirst]];
strInputTemp = [textField stringValue];
[textField setStringValue:[strInputTemp stringByAppendingString:strSec]];
[[textField currentEditor] setSelectedRange:NSMakeRange(atIndex-1,0)];
}



在判断NSTextField当前输入时,需要一个callback函数,可以通过NSTextField的

-(void)textDidChange:(NSNotification *)notification 来进行callback的设置。


设置好callback之后,就可以调用以上的方法,对NSTextField进行各种限制啦。

例如:


- (void)myTextFieldCallBack
{
NSRange range = [[myTextField currentEditor] selectedRange];
int iSel = range.location;
NSString*strInput = [myTextField stringValue];
constchar*acStr = [strInput UTF8String];
intnLen = [strInput length];
// 限制最大输入长度
if (nLen >6) 
{
[self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
return;
}
char cInputTmp = acStr[iSel -1];
// 限制输入:只有小数点和数字可以输入
if (('.'==acStr[iSel-1]) || (cInputTmp >= '0' && cInputTmp <='9') )
{
}
else
{
[self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
return;
}
// 限制小数点后只能输入两位
if ((cInputTmp >='0' && cInputTmp <='9') )
  {
NSRange range = [strInput rangeOfString:@"."];
if(range.length > 0)
{
 if( ((nLen - range.location) > 3))
 {
 [self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
 return;
 }
    }
  }
// 限制小数点出现的位置和次数
        // 第一个字符不能是小数点
if ('.' == acStr[iSel-1])
{
 if (iSel <2) 
 {
  [self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
  return;
 }
// 小数点在整个字串中只能出现一次 
NSRange rangesearch1 =NSMakeRange(0, iSel-1);
NSRange rangesearch2 =NSMakeRange(iSel, [strInput length]-iSel);
NSRange range1 = [strInput rangeOfString:@"." options:nil range:rangesearch1];
NSRange range2 = [strInput rangeOfString:@"." options:nil range:rangesearch2];
if(range1.length > 0 || range2.length >0)
 {
  [self textFieldNotAllowedInput:myTextField inString:strInput atIndex:iSel];
  return;
 }
 }
}




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
好的,以下是一份使用 Xcode 编写的简单示例代码,可以实现输入视频编号、点击下载按钮、自动下载m3u8视频到指定文件夹的功能。请注意,这只是一个示例,需要您自己根据具体情况进行修改和完善。 1. 创建一个新的 macOS 应用程序项目,并将窗口大小设置为适当大小。 2. 在 `ViewController.swift` 文件中,添加以下代码: ```swift import Cocoa class ViewController: NSViewController { @IBOutlet weak var videoNumberTextField: NSTextField! @IBOutlet weak var progressIndicator: NSProgressIndicator! var downloadTask: URLSessionDownloadTask? override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view. progressIndicator.isHidden = true } @IBAction func downloadButtonClicked(_ sender: NSButton) { guard let videoNumber = Int(videoNumberTextField.stringValue), videoNumber >= 1, videoNumber <= 20000 else { // 输入的视频编号不合法 return } progressIndicator.isHidden = false progressIndicator.startAnimation(nil) let session = URLSession.shared let url = URL(string: "http://example.com/videos/\(videoNumber).m3u8")! let downloadTask = session.downloadTask(with: url) { (location, response, error) in if let location = location { let destinationURL = self.getDestinationURL(for: videoNumber) do { try FileManager.default.moveItem(at: location, to: destinationURL) DispatchQueue.main.async { self.progressIndicator.stopAnimation(nil) self.progressIndicator.isHidden = true let alert = NSAlert() alert.messageText = "下载完成" alert.runModal() } } catch { print("下载视频失败:\(error.localizedDescription)") } } else { print("下载视频失败:\(error?.localizedDescription ?? "")") } } downloadTask.resume() self.downloadTask = downloadTask } private func getDestinationURL(for videoNumber: Int) -> URL { let documentsURL = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0] let fileName = "\(videoNumber).mp4" let fileURL = documentsURL.appendingPathComponent(fileName) return fileURL } } ``` 3. 在 `Main.storyboard` 中,将窗口中的 TextField 和 Button 拖拽到 `ViewController.swift` 文件中的 `@IBOutlet` 和 `@IBAction` 中。 4. 运行项目,输入视频编号,点击下载按钮,即可开始下载 m3u8 视频文件。下载完成后,会弹出一个提示框。 需要注意的是,示例代码中使用了一个假的视频链接 `http://example.com/videos/\(videoNumber).m3u8`,如果您想要使用真实的视频链接,请将其替换为您自己的链接。 另外,示例代码中只下载了一个 m3u8 文件,如果您需要下载多个分片文件,并进行合并,需要进行额外的编程。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值