Iphone 填空模型

Iphone 填空模型,iphone,objective-c,ios,uiwebview,uitextview,Iphone,Objective C,Ios,Uiwebview,Uitextview,我一直在努力为我的这个新应用程序找出正确的模式。事情是这样的。我需要创建一个考试类型的应用程序。该应用程序将有一个“语法”部分,需要一个段落,用填空的方法。所以看起来是这样的 "Lorem ipsum dolor sit amet, _________________ , sed do eiusmod tempor _______ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud

我一直在努力为我的这个新应用程序找出正确的模式。事情是这样的。我需要创建一个考试类型的应用程序。该应用程序将有一个“语法”部分,需要一个段落,用填空的方法。所以看起来是这样的

    "Lorem ipsum dolor sit amet, _________________ , sed do eiusmod tempor 
     _______ ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud 
     exercitation ullamco _________________ ex ea commodo consequat. Duis aute 
     irure dolor in reprehenderit in voluptate velit esse _______ dolore eu fugiat nulla 
     pariatur. ____________ sint occaecat cupidatat non proident, sunt in culpa qui   
     officia deserunt mollit anim id est laborum."

现在,该段落来自服务器。我们将空格标记为{#},因此当我在应用程序上显示它时,我会将其替换为“\uuuuuuu”,w/c相当于一个uitextfield。问题是我不知道该怎么做。我可以把所有的东西都放在uitextview中吗?我该如何处理空白?我不认为我能用uiwebview做到这一点,因为我需要更新空白内容,一旦我点击它们。请提供帮助。

您可以使用UIWebView。为了更新空格的内容,您可以在HTML页面中编写javascript,并将其与空格的onselect事件绑定

你可以看看我的答案

了解有关与webview通信的更多信息。(即从目标C执行javascript,反之亦然)


更新评论

是的,您可以从外部向webview传递字符串

[webViewInstance stringByEvaluatingJavaScriptFromString:[NSString stringWithFormat:@"displayTheStringInBlank(%@)", stringValue]];
并且编写一个JS函数是你的HTML文件来获取并显示空白中的字符串,

function displayTheStringInBlank(stringValue)
{
//Write code to use the string in the blank
document.getElementById("yourInputIdElement").value = stringValue;

}

我有时使用NSMutableString中的特殊标记作为替换字符串的占位符,然后根据需要使用以下代码替换它们:

if ([cStr rangeOfString:@"MYTAG"].location != NSNotFound)
    [cStr replaceCharactersInRange:[cStr rangeOfString:@"MYTAG"] withString:myNewString];

如果您需要任何好的格式,使用UIWebView将是一种不错的选择。

我的要求也是一样的,但我用本机代码解决了这个问题,使用UILabel和UIView,所有这些都是在一个循环中实际完成的。考虑下面的文字。

从前,那里有一个叫达摩克利斯的人。他的一个朋友最终成为了一个小城市的统治者。达摩克利斯想,“我的朋友真幸运。”。他现在是统治者了。他一定玩得很开心。

其中,每个作品都被视为
UILabel
空白,被视为
UIView
。正确的选项在有序列表中,如下所示

(lldb) po self.card.questionDataModel.fillAnswers
<__NSArrayI 0x6000008798c0>(
lived,
became,
is,
is,
must be having
)
此方法将有助于实现拖放功能

    - (void)handlePanGestureForFillInBlank:(UIPanGestureRecognizer*)sender{

        __block BOOL isDragOnBlank = NO;

        NSInteger tag = sender.view.tag;
        OptionsFrame senderRect = optionRect[tag];

        if (sender.state == UIGestureRecognizerStateBegan) {

        }
        else if (sender.state == UIGestureRecognizerStateChanged) {
            CGPoint translation = [sender translationInView:sender.view];
            sender.view.center = CGPointMake(sender.view.center.x + translation.x, sender.view.center.y + translation.y);
            [sender setTranslation:CGPointZero inView:sender.view];
        }
        else if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateCancelled) {

            for (UIView* blankView in self.blankViewContaninerList) {
                if (CGRectIntersectsRect(sender.view.frame, blankView.frame) && blankView.tag != -999) {
                    __weak typeof(self) weakSelf = self;
                    UILabel* selectedLabel = (UILabel*)sender.view;

                    [self computeAnswerFromSelectedLabel:selectedLabel blankView:blankView onCompletion:^(BOOL isCorrectAnswer, NSString *selectedAnswer) {
                        if (isCorrectAnswer) {

                            [selectedLabel setUserInteractionEnabled:NO];

                            blankView.tag = -999;   // Indicates that blank view already contains one label (blank space is already filled)

                            [UIView animateWithDuration:0.25 animations:^{
                                [sender.view setCenter:blankView.center];
                            } completion:^(BOOL finished) {
                                if (weakSelf.correctAnswerCount == weakSelf.totalOptionCount) {
// Your custom logic goes here, after all option dragged on their respective places.
                                }
                            }];
                        }
                        else{
                            [UIView animateWithDuration:0.25 animations:^{
                                [sender.view setFrame:CGRectMake(senderRect.origin.x, senderRect.origin.y, senderRect.size.width, senderRect.size.height)];
                            }];
                        }
                        isDragOnBlank = YES;
                    }];
                }
            }
            if(!isDragOnBlank) {
                [UIView animateWithDuration:0.25 animations:^{
                    [sender.view setFrame:CGRectMake(senderRect.origin.x, senderRect.origin.y, senderRect.size.width, senderRect.size.height)];
                }];
            }
        }
    }
此方法将告诉您拖动的选项空白是正确的还是错误的

- (void)computeAnswerFromSelectedLabel:(UILabel*)selectedLabel
                             blankView:(UIView*)blankView
                          onCompletion:(void(^)(BOOL isCorrectAnswer, NSString* selectedAnswer))onCompletion {

    NSInteger tagIndex = (blankView.tag - 600);

    NSString* correctAnswer  = self.card.questionDataModel.fillAnswers[tagIndex];
    NSString* selectedAnswer = selectedLabel.text;

    if ([correctAnswer isEqualToString:selectedAnswer]) {

        self.correctAnswerCount++;

        if (onCompletion) {
            onCompletion(YES, selectedAnswer);
        }
    }
    else {
        self.wrongAnswerCount++;

        // Shake the container view if dragging is wrong.
        [self shakeView:self.fillBlankContainerView withOffest:8];
        if(onCompletion){
            onCompletion(NO, selectedAnswer);
        }        
    }
}

请随意使用代码,欢迎改进:)


继续编码

好的。现在是否可以从uiwebview外部传递一个字符串以在其中一个空格中反映它?当我点击空白时,我会向下滑动一个视图,其中包含这些单词中的单词(选择)敲击将反映被选中的空白。我可以这样做吗?我知道我将通过loadHtmlString为uiwebview加载html,这是否意味着我将更新htmlString并刷新uiwebview?如果我这样做,以前的输入会发生什么?您不必使用新的HTML字符串重新加载整个webview。您可以在那里使用Javascript方法。看我更新的答案。谢谢老兄!你帮了大忙。一切正常。现在我的问题是如何在点击文本字段时不显示键盘?因为我想在点击uiwebview中的文本字段时显示一个自定义视图。有什么解决方案吗?您可以提供完整的源代码plz!如果是在斯威夫特,那就太好了!我没有,这是很久以前写的。如果你能帮我查一下我的问题吗
    - (void)handlePanGestureForFillInBlank:(UIPanGestureRecognizer*)sender{

        __block BOOL isDragOnBlank = NO;

        NSInteger tag = sender.view.tag;
        OptionsFrame senderRect = optionRect[tag];

        if (sender.state == UIGestureRecognizerStateBegan) {

        }
        else if (sender.state == UIGestureRecognizerStateChanged) {
            CGPoint translation = [sender translationInView:sender.view];
            sender.view.center = CGPointMake(sender.view.center.x + translation.x, sender.view.center.y + translation.y);
            [sender setTranslation:CGPointZero inView:sender.view];
        }
        else if (sender.state == UIGestureRecognizerStateEnded || sender.state == UIGestureRecognizerStateCancelled) {

            for (UIView* blankView in self.blankViewContaninerList) {
                if (CGRectIntersectsRect(sender.view.frame, blankView.frame) && blankView.tag != -999) {
                    __weak typeof(self) weakSelf = self;
                    UILabel* selectedLabel = (UILabel*)sender.view;

                    [self computeAnswerFromSelectedLabel:selectedLabel blankView:blankView onCompletion:^(BOOL isCorrectAnswer, NSString *selectedAnswer) {
                        if (isCorrectAnswer) {

                            [selectedLabel setUserInteractionEnabled:NO];

                            blankView.tag = -999;   // Indicates that blank view already contains one label (blank space is already filled)

                            [UIView animateWithDuration:0.25 animations:^{
                                [sender.view setCenter:blankView.center];
                            } completion:^(BOOL finished) {
                                if (weakSelf.correctAnswerCount == weakSelf.totalOptionCount) {
// Your custom logic goes here, after all option dragged on their respective places.
                                }
                            }];
                        }
                        else{
                            [UIView animateWithDuration:0.25 animations:^{
                                [sender.view setFrame:CGRectMake(senderRect.origin.x, senderRect.origin.y, senderRect.size.width, senderRect.size.height)];
                            }];
                        }
                        isDragOnBlank = YES;
                    }];
                }
            }
            if(!isDragOnBlank) {
                [UIView animateWithDuration:0.25 animations:^{
                    [sender.view setFrame:CGRectMake(senderRect.origin.x, senderRect.origin.y, senderRect.size.width, senderRect.size.height)];
                }];
            }
        }
    }
- (void)computeAnswerFromSelectedLabel:(UILabel*)selectedLabel
                             blankView:(UIView*)blankView
                          onCompletion:(void(^)(BOOL isCorrectAnswer, NSString* selectedAnswer))onCompletion {

    NSInteger tagIndex = (blankView.tag - 600);

    NSString* correctAnswer  = self.card.questionDataModel.fillAnswers[tagIndex];
    NSString* selectedAnswer = selectedLabel.text;

    if ([correctAnswer isEqualToString:selectedAnswer]) {

        self.correctAnswerCount++;

        if (onCompletion) {
            onCompletion(YES, selectedAnswer);
        }
    }
    else {
        self.wrongAnswerCount++;

        // Shake the container view if dragging is wrong.
        [self shakeView:self.fillBlankContainerView withOffest:8];
        if(onCompletion){
            onCompletion(NO, selectedAnswer);
        }        
    }
}