我怎么能转换NSRange到Range<String.Index>斯威夫特?
我想使用以下UITextFieldDelegate方法:
func textField(textField: UITextField!,
shouldChangeCharactersInRange range: NSRange,
replacementString string: String!) -> Bool {
textField.text.stringByReplacingCharactersInRange(???, withString: string)
Run Code Online (Sandbox Code Playgroud)

问题:当我使用使用Range的Swift String时,NSAttributedString接受NSRange
let text = "Long paragraph saying something goes here!"
let textRange = text.startIndex..<text.endIndex
let attributedString = NSMutableAttributedString(string: text)
text.enumerateSubstringsInRange(textRange, options: NSStringEnumerationOptions.ByWords, { (substring, substringRange, enclosingRange, stop) -> () in
if (substring == "saying") {
attributedString.addAttribute(NSForegroundColorAttributeName, value: NSColor.redColor(), range: substringRange)
}
})
Run Code Online (Sandbox Code Playgroud)
产生以下错误:
错误:'Range'不能转换为'NSRange'aligolsString.addAttribute(NSForegroundColorAttributeName,value:NSColor.redColor(),range:substringRange)
我正在使用shouldChangeCharactersInRange作为使用动态类型搜索的一种方式.
但是我遇到了问题,在文本字段实际更新之前调用了更改角色的内容:
在Objective C中,我使用以下方法解决了这个问题:
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString * searchStr = [textField.text stringByReplacingCharactersInRange:range withString:string];
return YES;
}
Run Code Online (Sandbox Code Playgroud)
但是,我试过在Swift中写这个:
func textField(textField: UITextField!, shouldChangeCharactersInRange range: NSRange, replacementString string: String!) -> Bool {
let txtAfterUpdate:NSString = self.projectSearchTxtFld.text as NSString
txtAfterUpdate.stringByReplacingCharactersInRange(range, withString: string)
self.callMyMethod(txtAfterUpdate)
return true
}
Run Code Online (Sandbox Code Playgroud)
在得到值之前,该方法仍会被调用?
这就是我想要做的事情:
NSRange r = NSMakeRange(0,5);
id a = [NSMutableArray a];
[a addObject: r]; // but NSRange is not a NSObject *
Run Code Online (Sandbox Code Playgroud)
使用布尔值,我会使用这样的代码:
[a addObject: [NSNumber numberWithBool: YES]];
Run Code Online (Sandbox Code Playgroud)
或者用整数:
[a addObject: [NSNumber numberWithInteger: 3]];
Run Code Online (Sandbox Code Playgroud)
那么什么是等同于NSRange?我真的不想做的是创建我自己的子类NSObject来完成这个.当然苹果已经提供了一种方式吗?
是否有一个简短的方法来说"整个字符串"而不是输入:
NSMakeRange(0, myString.length)]
Run Code Online (Sandbox Code Playgroud)
这种代码中最长的一部分是最不重要的(因为我通常想在整个字符串中搜索/替换),这似乎很愚蠢......
[myString replaceOccurrencesOfString:@"replace_me"
withString:replacementString
options:NSCaseInsensitiveSearch
range:NSMakeRange(0, myString.length)];
Run Code Online (Sandbox Code Playgroud) 我需要在textview中找到不同范围的像素帧.我正在用- (CGRect)firstRectForRange:(UITextRange *)range;它来做.但是我无法找到如何实际创建一个UITextRange.
基本上这就是我要找的东西:
- (CGRect)frameOfTextRange:(NSRange)range inTextView:(UITextView *)textView {
UITextRange*range2 = [UITextRange rangeWithNSRange:range]; //DOES NOT EXIST
CGRect rect = [textView firstRectForRange:range2];
return rect;
}
Run Code Online (Sandbox Code Playgroud)
Apple表示必须进行子类化UITextRange并UITextPosition采用该UITextInput协议.我不这样做,但无论如何,我尝试了,遵循doc的示例代码并传递firstRectForRange导致崩溃的子类.
如果有更简单的方法UILables可以在textview 中添加不同的颜色,请告诉我.我尝试使用content editable设置为TRUE的UIWebView ,但我不喜欢与JS通信,并且着色是我唯一需要的东西.
提前致谢.
我接受一个NSString随机size的a UITextField并将其传递给我正在创建的方法,该方法将仅捕获输入的最后4个字符string.
我查看了NSString类参考库,我发现的唯一真正的选项看起来会像我想要的那样
- (void)getCharacters:(unichar *)buffer range:(NSRange)aRange
Run Code Online (Sandbox Code Playgroud)
我曾经使用过一次,但是静态参数'不会改变',但对于这个实现,我想使用非静态参数,这些参数会根据进入的字符串的大小而改变.
到目前为止,这是我创建的方法,它NSString从IBAction 传递给其他地方.
- (void)padString:(NSString *)funcString
{
NSString *myFormattedString = [NSString stringWithFormat:@"%04d",[funcString intValue]]; // if less than 4 then pad string
// NSLog(@"my formatedstring = %@", myFormattedString);
int stringLength = [myFormattedString length]; // captures length of string maybe I can use this on NSRange?
//NSRange MyOneRange = {0, 1}; //<<-------- should I use this? if so how?
}
Run Code Online (Sandbox Code Playgroud) 我有一个UILabel以编程方式制作的:
var label = UILabel()
Run Code Online (Sandbox Code Playgroud)
然后,我为标签声明了一些样式,包括字体,例如:
label.frame = CGRect(x: 20, y: myHeaderView.frame.height / 2, width: 300, height: 30)
label.font = UIFont(name: "Typo GeoSlab Regular Demo", size: 15)
label.textColor = UIColor(hue: 0/360, saturation: 0/100, brightness: 91/100, alpha: 1)
Run Code Online (Sandbox Code Playgroud)
标签的第一部分将始终显示:"Filter:"然后是字符串的另一部分,例如"最受欢迎"
我希望单词过滤器以粗体显示,所以整个过程看起来像:
过滤:最受欢迎
我想以最简单的方式创建这种效果.我一直在互联网上搜索如何实现这一点,有很多方法,有些看起来像代码页.其中大部分似乎都是在Objective-C中.我想在Swift请:)
我不知道我是否在正确的路线上,但这NSRange有助于实现吗?提前致谢
更新
我使用一系列if语句来改变我的label变量.如:
if indexArray == 1 {
label.text = "Filter: Film name"
} else if indexArray == 2 {
label.text = "Filter: Most popular"
} else if …Run Code Online (Sandbox Code Playgroud) 当我尝试从较大的字符串中提取字符串时,它会给出范围或索引超出范围的错误.我可能会忽略一些非常明显的东西.谢谢.
NSString *title = [TBXML textForElement:title1];
TBXMLElement * description1 = [TBXML childElementNamed:@"description" parentElement:item1];
NSString *description = [TBXML textForElement:description1];
NSMutableString *des1 = [NSMutableString stringWithString:description];
//search for <pre> tag for its location in the string
NSRange match;
NSRange match1;
match = [des1 rangeOfString: @"<pre>"];
match1 = [des1 rangeOfString: @"</pre>"];
NSLog(@"%i,%i",match.location,match1.location);
NSString *newDes = [des1 substringWithRange: NSMakeRange (match.location+5, match1.location-1)]; //<---This is the line causing the error
NSLog(@"title=%@",title);
NSLog(@"description=%@",newDes);
Run Code Online (Sandbox Code Playgroud)
更新:范围的第二部分是长度,而不是端点.D'哦!
之间有什么区别:
NSRange(location: 0, length: 5)
Run Code Online (Sandbox Code Playgroud)
和:
NSMakeRange(0, 5)
Run Code Online (Sandbox Code Playgroud)
因为Swiftlint我使用时会发出警告NSMakeRange,但我不知道为什么.
谢谢您的帮助 :-)