如何实现添加和删除主题标签

时间:2015-05-05 18:45:10

标签: ios objective-c regex

我需要实现这样的事情:

enter image description here

hashtag条目区域需要像这样工作: 你开始链接#已经存在。你不能删除这个#。您键入您的主题标签,该主题标签不得包含任何空格。当您键入空格时,它会“输入”主题标签。这会在它周围放一个带有X按钮图标的灰色框。这显示了输入的主题标签。如果点击X,它将删除标签,所有类型将向左移动。 键入空格后,它会在框内标签的右侧移动一个空格,然后再以#开头,这样您就不必在创建标记时键入#。

我知道如何使用UITextView, - (void)textViewDidChange:(UITextView *)textView,TTTAttributedLabel,但这是相当多的工作。我想看看其他人是否已经以更简单和优雅的方式解决了这个问题。

是否有现成的库来执行此操作?

我想解决这个问题的方法是拥有一个可以链接到所有主题标签的TTTAttributedLabel。有一个UITapGestureRecognizer附加到TTTAttributedLabel,因此如果没有按下hashtag,它会触发位于TTTAttributedLabel后面的UITextView来显示键盘。 UITextView填充空格以将类型指示器移动到正确的位置。这是很多工作 - 想知道是否有人有一个更整洁的解决方案。

1 个答案:

答案 0 :(得分:0)

嗯,这是:

 - (void)viewDidLoad
    {
      [super viewDidLoad];
      self.post = [UITextView new];
      self.post.autocorrectionType = UITextAutocorrectionTypeNo;
      self.post.autocapitalizationType = UITextAutocapitalizationTypeNone;
      self.post.frame = Frame(304,250,734,458);
      //  message.backgroundColor = [UIColor blueColor];
      self.post.delegate = self;
      self.post.font = [UIFont fontWithName:@"AauxProOT-Regular" size:Normalize(40)];
    //  self.post.textColor = [UIColor colorWithRed:(73/255.0) green:(73/255.0) blue:(73/255.0) alpha:1];
      self.post.backgroundColor = [UIColor clearColor];
      self.post.keyboardType = UIKeyboardTypeTwitter;
      [self.view addSubview:self.post];
}

- (void)textViewDidChange:(UITextView *)textView
{
  if (self.post.text.length == 0)
  {
    // USER HAS DELETED ALL TEXT
    self.post.text = @"#";
    return;
  }

  if ([[self.post.text substringFromIndex:[self.post.text length] - 2] isEqualToString:@"# "])
  {
    self.post.text = [self.post.text substringToIndex:[self.post.text length] - 1];
    return;
  }

  if (self.post.text.length > 1 && [[self.post.text substringFromIndex:[self.post.text length] - 1] isEqualToString:@"#"])
  {
    self.post.text = [self.post.text substringToIndex:[self.post.text length] - 1];
    return;
  }

  if ([[self.post.text substringFromIndex:[self.post.text length] - 2] isEqualToString:@"X "])
  {
    self.post.text = [NSString stringWithFormat:@"%@%@", self.post.text, @"#"];
  }
  else if ([[self.post.text substringFromIndex:[self.post.text length] - 1] isEqualToString:@" "])
  {
    // COMPLETE NEW HASHTAG
    self.post.text = [self.post.text substringToIndex:[self.post.text length] - 1];
    self.post.text = [NSString stringWithFormat:@"%@%@", self.post.text, @" X #"];
  }

  if ([self.post.text rangeOfString:@" X #"].location != NSNotFound)
    [self formatHashtags];
}

- (void)textViewDidChangeSelection:(UITextView *)textView
{
  NSRange selectedRange = textView.selectedRange;
  if (selectedRange.location < self.post.text.length)
  {
    NSError *error = NULL;
    NSRegularExpression *hashTagRegex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+)[ ]X[ ]" options:NSRegularExpressionCaseInsensitive error:&error];
    //  NSMutableArray *ranges = [NSMutableArray new];
    [hashTagRegex enumerateMatchesInString:self.post.text options:0 range:NSMakeRange(0, [self.post.text length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
      NSRange matchedRange = [match rangeAtIndex:1];
      //    [ranges addObject:selectedRange];
      matchedRange.location = matchedRange.location - 1;
      matchedRange.length = matchedRange.length + 3;
      if (selectedRange.location >= matchedRange.location  && selectedRange.location <= (matchedRange.location + matchedRange.length))
      {
        NSString* part1 = [self.post.text substringToIndex:matchedRange.location];
        NSString* part2 = [self.post.text substringFromIndex:matchedRange.location+matchedRange.length + 1];
        self.post.text = [part1 stringByAppendingString:part2];
      }
    }];

    textView.selectedRange = NSMakeRange(self.post.text.length, 0);
    [self formatHashtags];
  }
}

-(void)formatHashtags
{
  NSMutableAttributedString *originalMutableAttributedString = [[NSMutableAttributedString alloc]initWithAttributedString:self.post.attributedText];
  NSRange originalRange = NSMakeRange(0, originalMutableAttributedString.length);
  [originalMutableAttributedString setAttributes:@{} range:originalRange];
//  [[originalMutableAttributedString mutableString] setString:@""];
  self.post.attributedText = originalMutableAttributedString;


  NSError *error = NULL;
  NSRegularExpression *hashTagRegex = [NSRegularExpression regularExpressionWithPattern:@"#(\\w+) X " options:NSRegularExpressionCaseInsensitive error:&error];
//  NSMutableArray *ranges = [NSMutableArray new];
  [hashTagRegex enumerateMatchesInString:self.post.text options:0 range:NSMakeRange(0, [self.post.text length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
    NSRange selectedRange = [match rangeAtIndex:1];
//    [ranges addObject:selectedRange];
    selectedRange.location = selectedRange.location - 1;
    selectedRange.length = selectedRange.length + 3;
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithAttributedString:self.post.attributedText];
    [attributedString addAttribute:NSBackgroundColorAttributeName
                             value:[UIColor colorWithRed:(173/255.0) green:(173/255.0) blue:(173/255.0) alpha:1]
                             range:selectedRange];
    self.post.attributedText = attributedString;
  }];

  error = NULL;
  NSRegularExpression *xes = [NSRegularExpression regularExpressionWithPattern:@"X[ ]#" options:NSRegularExpressionCaseInsensitive error:&error];
  //  NSMutableArray *ranges = [NSMutableArray new];
  [xes enumerateMatchesInString:self.post.text options:0 range:NSMakeRange(0, [self.post.text length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
    NSRange selectedRange = [match rangeAtIndex:0];
    //    [ranges addObject:selectedRange];
    selectedRange.length = 1;
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]initWithAttributedString:self.post.attributedText];
    [attributedString addAttribute:NSFontAttributeName
                             value:[UIFont fontWithName:@"Arial-BoldMT" size:Normalize(35)]
                             range:selectedRange];
    self.post.attributedText = attributedString;
  }];
}