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);
}
}
}