在Swift 2中使用KSTokenView

时间:2015-09-17 21:46:37

标签: ios swift swift2 kstokenview

我正在尝试在我的Swift 2项目中实现KSTokenView。我修复了转换中的所有小错误,但我有三个相同错误的实例,我无法弄清楚如何修复。问题是使用advance方法,我得到一个编译时错误,上面写着'advance is unavailable: call the advancedBy(n)' method on the index.我试图查看涉及这种方法的另一个答案,但经过一段时间的努力,我无法弄明白。

问题代码是:

第一个实例是在下面的方法中,我将用注释标记

private func _updateText() {
    if (!_setupCompleted) {return}
    _initPlaceholderLabel()

    switch(_state) {
    case .Opened:
        text = KSTextEmpty
        break

    case .Closed:
        if tokens.count == 0 {
            text = KSTextEmpty

        } else {
            var title = KSTextEmpty
            for token: KSToken in tokens {
                title += "\(token.title)\(_separatorText!)"
            }

            if (title.characters.count > 0) {
                //advance call made in the statement below
                title = title.substringWithRange(Range<String.Index>(start: advance(title.startIndex, 0), end: advance(title.endIndex, -_separatorText!.characters.count)))
            }

            let width = KSUtils.widthOfString(title, font: font!)
            if width + _leftViewRect().width > bounds.width {
                text = "\(tokens.count) \(_descriptionText)"
            } else {
                text = title
            }
        }
        break
    }
    _updatePlaceHolderVisibility()
}

第二个和第三个实例在if函数if(string.isEmpty)中称为textField:shouldChangeCharactersInRange。我还将标记if语句和两个高级方法调用。

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {

    // If backspace is pressed
    if (_tokenField.tokens.count > 0 && _tokenField.text == KSTextEmpty && string.isEmpty == true && shouldDeleteTokenOnBackspace) {
        if (_lastToken() != nil) {
            if (selectedToken() != nil) {
                deleteSelectedToken()
            } else {
                _tokenField.selectToken(_lastToken()!)
            }
        }
        return false
    }

    // Prevent removing KSEmptyString
    if (string.isEmpty == true && _tokenField.text == KSTextEmpty) {
        return false
    }

    var searchString: String
    let olderText = _tokenField.text

    // Check if character is removed at some index
    // Remove character at that index
    if (string.isEmpty) { //advance calls are made in this if statement
        let first: String = olderText!.substringToIndex(advance(olderText!.startIndex, range.location)) as String // advance called here (1/2)
        let second: String = olderText!.substringFromIndex(advance(olderText!.startIndex, range.location+1)) as String // advance called here (2/2)
        searchString = first + second

    }  else { // new character added
        if (tokenizingCharacters.contains(string) && olderText != KSTextEmpty && olderText!.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet()) != "") {
            addTokenWithTitle(olderText!, tokenObject: nil)
            return false
        }
        searchString = olderText!+string
    }

    // Allow all other characters
    if (searchString.characters.count >= minimumCharactersToSearch && searchString != "\n") {
        _lastSearchString = searchString
        startSearchWithString(_lastSearchString)
    }
    _tokenField.scrollViewScrollToEnd()
    return true
}

编辑:想出来。取第一个参数并在其上调用advancedBy(n)。然后将第二个参数放在'n'槽中。

示例:let second: String = olderText!.substringFromIndex(olderText!.startIndex.advancedBy(range.location+1)) as String

0 个答案:

没有答案