仅iOS 8.1间歇性地显示UITextView

问题描述:

我有一个模板测验应用程序,它已经在应用商店中以各种形式出现了一段时间,总的来说它收到了很好的评价并且没有错误报告。仅iOS 8.1间歇性地显示UITextView

最近我有两个错误报告,人们使用iOS 8.1.2或8.1.3的iPad,并说现在和我用来显示问题的UITextView是空白的。

我一直无法复制这个错误,但如果有人能够阐明这个错误,我将不胜感激。

对象questionsuserAnswer不是零,所以它肯定是一个UITextView问题。

该控制器是在这里:

 
@interface ReviewController() 
@property (strong, nonatomic) IBOutlet UITextView *output; 

@end 

@implementation ReviewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self setReviewText]; 
    // Do any additional setup after loading the view. 
} 

-(void)setReviewText{ 

    NSArray* questions = [[NSArray alloc] init]; 
    questions = [_manager getAllQuestions]; 
    NSMutableArray* userAnswer = [[NSMutableArray alloc] init]; 
    userAnswer = [self answersAttributed]; 

    if(questions == nil) 
     _output.text = @"Questions Error"; 

    if (userAnswer == nil) 
    { 
     _output.text = @"Error"; 
    } 

    NSMutableAttributedString *mutableAttString = [[NSMutableAttributedString alloc] init]; 

    int i = 0; 
    NSAttributedString *linebreak =[[NSAttributedString alloc] initWithString:@"\n"]; 
    for (Question* q in questions) 
    { 
     if (i == [userAnswer count]) 
      break; 

     NSAttributedString *qtext =[[NSAttributedString alloc] initWithString:q.questionText]; 
     NSAttributedString *ctext =[[NSAttributedString alloc] initWithString:@"Correct Answer:\n"]; 

     NSAttributedString *atext =[[NSAttributedString alloc] initWithString:q.answerText]; 
     NSAttributedString *ytext =[[NSAttributedString alloc] initWithString:@"Your Answer:\n"]; 
     NSAttributedString *utext =[[NSAttributedString alloc] initWithAttributedString:userAnswer[i]]; 
     [mutableAttString appendAttributedString:qtext]; 
     [mutableAttString appendAttributedString:linebreak]; 
     [mutableAttString appendAttributedString:ctext]; 
     [mutableAttString appendAttributedString:atext]; 
     [mutableAttString appendAttributedString:linebreak]; 
     [mutableAttString appendAttributedString:ytext]; 
     [mutableAttString appendAttributedString:utext]; 
     [mutableAttString appendAttributedString:linebreak]; 
     [mutableAttString appendAttributedString:linebreak]; 
     i++; 
    } 
    NSAttributedString* outText = [[NSAttributedString alloc] init]; 
    outText = [mutableAttString mutableCopy]; 
    _output.attributedText = outText; 
    [_output setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]]; 
} 


-(NSMutableArray*)answersAttributed 
{ 
    NSMutableArray* ansAtt = [[NSMutableArray alloc] init]; 
    NSArray* questions = [[NSArray alloc] init]; 
    questions = [_manager getAllQuestions]; 

    NSArray* userAnswers = [[NSArray alloc] init]; 
    userAnswers = [_manager getAllUserAnswers]; 


    if ([questions count] != [userAnswers count]) 
    { 
     return ansAtt; 
    } 


    int i = 0; 
    for (NSString* userAnswer in userAnswers) 
    { 
     if([[questions[i] answerText] isEqualToString:userAnswer]) 
     { 
      NSDictionary *attributes = @{NSBackgroundColorAttributeName:[UIColor greenColor]}; 
      NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:userAnswer attributes:attributes]; 
      [ansAtt addObject:attrString]; 
     } 
     else 
     { 
      NSDictionary *attributes = @{NSBackgroundColorAttributeName:[UIColor redColor]}; 
      NSAttributedString *attrString = [[NSAttributedString alloc] initWithString:userAnswer attributes:attributes]; 
      [ansAtt addObject:attrString]; 

     } 
     i++; 
    } 

    return ansAtt; 
} 


- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    // Make sure your segue name in storyboard is the same as this line 
    if ([[segue identifier] isEqualToString:@"review2results"]) 
    { 
     // Get reference to the destination view controller 
     ReviewController *vc = [segue destinationViewController]; 

     // Pass any objects to the view controller here, like... 
     [vc setManager:_manager]; 
    } 
} 
+0

是否使用自动版式?它可能与旋转有关 - 比如说如果在问题加载时旋转设备? – brandonscript 2015-02-09 21:54:18

+0

我正在使用AutoLayout,但我已将应用程序配置为只能在纵向模式下工作。有人说,大约50%的时间'UITextView'没有出现,似乎他们每次都在旋转,但我会问。感谢您的建议。 – James 2015-02-09 21:56:34

+0

是的,这听起来不太可能! – brandonscript 2015-02-09 21:57:11

随着自动布局,如果你没有足够的约束,以充分指定大小和位置,然后有时你会看到和,有时你不能。未指定的约束可以具有随机值,如0高度或离屏位置。

检查以确保约束完全指定。

Storyboard标记为Non-EditableNon-Selectable我的情况textviewiOS 8.1同样奇怪的行为(在iOS的9+没有问题)。

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    textview.attributedText = [[NSAttributedString alloc] initWithString:@"non-nil"]]; 
    value = textview.attributedText; 
    //^ value is nil !!! 
} 

修正了这一点:

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    textview.editable = YES; 
    textview.attributedText = [[NSAttributedString alloc] initWithString:@"non-nil"]]; 
    textview.editable = NO; 
    value = textview.attributedText; 
    //^ value is @"non-nil" now !!! 
}