作者:mobiledu2502854957 | 来源:互联网 | 2023-05-19 11:20
我正在开发一个消息传递应用程序,并希望iOS 8中的预测键盘能够识别正在撰写消息的用户正在回复上一条消息.
所以我希望能够将一个字符串提供给键盘以提供预测的上下文.因此,如果向用户询问可以解释为极性的问题(是/否),那么预测键盘应具有Yes | No | Maybe
这对开发人员有用吗?
请注意,我不是在谈论自定义键盘,只是为标准键盘提供一些预测的上下文.我也不关心在这个问题中实际定制快速类型的回复.我只是想让键盘知道它输入的内容.
1> Fennelouski..:
无法严格将建议输入默认键盘.但是,如果您想为用户提供相同的体验,我会隐藏iOS建议栏myTextView.autocorrectiOnType= UITextAutocorrectionTypeNo;
,然后用我自己的自定义视图替换该视图,该视图模仿建议视图,直到.用户键入字符或选择选项后,隐藏自定义建议视图并重新启用iOS建议栏.
我子类UIInputView只为这(透明度和过渡是有点过,但一切运作非常好).
#import
@protocol SuggestionViewDelegate
@required
- (void)suggestionSelected:(NSString *)suggestion;
@end
@interface SuggestionView : UIInputView
- (instancetype)init;
- (instancetype)initWithFrame:(CGRect)frame;
/**
* The list of suggestions being displayed.
* The array contains 0-3 strings.
*
* @return Array of NSString's representing the current suggested strings
*/
- (NSArray *)suggestions;
/**
* Add a suggestion to display in the view.
* If there are already maxSuggestionCount suggestions, the added suggestion will push one of them out.
* If there are already maxSuggestionCount suggestions and the input is 'nil' then the last suggestion will be removed.
*
* @param suggestion String to suggest to the user
*/
- (void)addSuggestion:(NSString *)suggestion;
/**
* Removes the suggestion from the list of displayed suggestions.
* If the string is not in the set then there is no change made.
*
* @param suggestion NSString to remove from the suggested strings
*/
- (void)removeSuggestion:(NSString *)suggestion;
/**
* Takes in either NSArray or NSSet and replaces 'suggestions' with the input.
* Only the first three arguments are recognized.
* Objects should be strings. Undefined behavior otherwise.
*
* @param suggestions NSArray or NSSet with 0-3 NSStrings
*/
- (void)setSuggestions:(NSObject *)suggestions;
@property (weak) id delegate;
/**
* The maximum number of suggestions allowed. Default is 3.
*/
@property (nonatomic) NSInteger maxSuggestionCount;
@end
#import "SuggestionView.h"
#define kScreenWidth [UIScreen mainScreen].bounds.size.width
@implementation SuggestionView {
NSMutableOrderedSet *_suggestions;
NSMutableArray *_suggestionButtons;
}
- (instancetype)init {
self = [self initWithFrame:CGRectMake(0.0f, 0.0f, kScreenWidth, 36.0f)];
if (self) {
}
return self;
}
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame inputViewStyle:UIInputViewStyleKeyboard];
if (self) {
_suggestiOns= [[NSMutableOrderedSet alloc] initWithCapacity:3];
self.maxSuggestiOnCount= 3;
_suggestiOnButtons= [[NSMutableArray alloc] init];
self.backgroundColor = [UIColor colorWithWhite:0.0f alpha:0.04f];
}
return self;
}
#pragma mark - Modifying Suggestions
- (void)addSuggestion:(NSString *)suggestion {
if (suggestion) {
[_suggestions addObject:suggestion];
}
while (_suggestions.count > self.maxSuggestionCount) {
[_suggestions removeObjectAtIndex:self.maxSuggestionCount];
}
}
- (void)removeSuggestion:(NSString *)suggestion {
[_suggestions removeObject:suggestion];
}
- (void)setSuggestions:(NSObject *)suggestions {
if ([suggestions respondsToSelector:@selector(countByEnumeratingWithState:objects:count:)]) {
[_suggestions removeAllObjects];
for (NSString *suggestion in (NSArray *)suggestions) {
if (_suggestions.count 0) {
UIView *whiteLine = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 0.5f, self.bounds.size.height)];
whiteLine.backgroundColor = [UIColor whiteColor];
[suggestionButton addSubview:whiteLine];
}
[_suggestionButtons addObject:suggestionButton];
}
}
#pragma mark - Selecting a Suggestion
- (void)buttonTouched:(UIButton *)button {
NSTimeInterval animatiOnDuration= 0.09f;
[UIView animateWithDuration:animationDuration animations:^{
[button setBackgroundColor:[UIColor whiteColor]];
if ([self.delegate respondsToSelector:@selector(suggestionSelected:)]) {
[self performSelector:@selector(suggestionSelected:) withObject:button.currentTitle afterDelay:animationDuration * 0.9f];
}
[button performSelector:@selector(setBackgroundColor:) withObject:[UIColor clearColor] afterDelay:animationDuration];
}];
}
- (void)suggestionSelected:(NSString *)suggestion {
if ([self.delegate respondsToSelector:@selector(suggestionSelected:)]) {
[self.delegate suggestionSelected:suggestion];
}
}
@end
要将其实现为已经UITextField
或UITextView
已经子类化的,请导入SuggestionView并实现SuggestionViewDelegate.然后,在UITextFieldDelegate
(或UITextViewDelegate
)方法中,添加:
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
if ([textField isEqual:self.messageTextField]) {
if (self.suggestionView.suggestions.count > 0 && textField.text.length == 0) {
textField.inputAccessoryView = self.suggestionView;
textField.autocorrectiOnType= UITextAutocorrectionTypeNo;
[textField reloadInputViews];
}
}
return YES;
}
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
if ([textField isEqual:self.messageTextField]) {
if (string.length > 0) {
[self removeSuggestionView];
}
}
return YES;
}
- (void)removeSuggestionView {
self.messageTextField.inputAccessoryView = nil;
[self.messageTextField setInputAccessoryView:nil];
self.messageTextField.autocorrectiOnType= UITextAutocorrectionTypeYes;
[self.messageTextField reloadInputViews];
[self.messageTextField performSelector:@selector(resignFirstResponder) withObject:self afterDelay:0.0f];
[self.messageTextField performSelector:@selector(becomeFirstResponder) withObject:self afterDelay:0.0f];
}
然后,实现SuggestionViewDelegate
:
- (void)suggestionSelected:(NSString *)suggestion {
[self.messageTextField setText:[NSString stringWithFormat:@"%@%@ ", self.messageTextField.text, suggestion]];
[self removeSuggestionView];
}
虽然这不是一个完美的解决方案,但它确实产生了预期的效果.
虽然我希望有人会突然说,"是的,这是可能的,只做XYZ",这是一个不可思议的答案.感谢您分享您的代码和方法 - 我只是希望Apple能够打开它,虽然我认为使用Messages而不是WhatsApp,FB Messenger,Kik等等是一个小胡萝卜.