Почему клавиатура не отображается в моем UITextView? - PullRequest
3 голосов
/ 10 июня 2011

У меня есть класс контейнера, который является контроллером представления.
Он содержит UITextView для заметок и имеет другой контроллер представления в качестве подпредставления, который называется PDFViewController. У этого есть массив контроллеров представления, названных их PageViewController's, в нем и UIScrollView, таким образом я могу пролистать различные контроллеры представления от массива.

Каждый из PageViewController имеет также UIScrollView, поэтому я могу масштабировать различные страницы.

Но когда я показываю свой UITextView, я не могу ничего редактировать или писать.
Он показывает мигающий курсор, но без клавиатуры и не может писать текст.
Когда я выделяю слово из текста по умолчанию, он показывает мне некоторые параметры словаря, но слова не будут заменены.

Я просто не знаю, где может быть проблема.

container.m (View Controller)

- (void) initNotes {

notesVisible = FALSE;
notes = [[UITextView alloc]initWithFrame:CGRectMake(10, 10, note_width, note_height)];
notes.backgroundColor = [UIColor yellowColor];
notes.font = [UIFont fontWithName:@"Arial" size:24];  
notes.text = @"Hier ist Platz für Ihre Notizen";

container = [[UIView alloc] initWithFrame:CGRectMake(start_x, start_y, container_width, container_height)];
container.backgroundColor = [UIColor yellowColor];
[container.layer setShadowColor:[[UIColor blackColor] CGColor]];
[container.layer setShadowOffset:CGSizeMake(2.0, 3.0)];
[container.layer setShadowOpacity:0.6];
[container.layer setShadowRadius:5];
container.layer.shouldRasterize = YES;
[container addSubview:notes];
[self.view addSubview:container];
}

- (void) showTextView {
[UIView beginAnimations:@"MoveAndStrech" context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

container.frame = CGRectMake(start_x, self.view.center.y-container_height, container_width, container_height); 

[UIView commitAnimations];

notesVisible = !notesVisible;
}

- (void) hideTextView {

[UIView beginAnimations:@"MoveAndStrech" context:nil];
[UIView setAnimationDuration:0.4];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn];

container.frame = CGRectMake(start_x, start_y, container_width, container_height); 

// [notes resignFirstResponder];
[UIView commitAnimations];

notesVisible = !notesVisible;
}

@ реализация PDFViewController

- (void)awakeFromNib
{
painting = false;
dataInstance = [PDFDataInstance sharedInstance];
chapter = [dataInstance chapter];
[self getNumberOfPages];
kNumberOfPages = dataInstance.pages;

// Register observer to be called when a cell from BookmarkPDFController is pressed
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(didSelectBookmark:) 
                                             name:@"bookmarkPressedinPDFView" object:nil];
// Register observer to be called when a cell from BookmarkPDFController is pressed
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(togglePainting:) 
                                             name:@"togglePainting" object:nil];

    // view controllers are created lazily
// in the meantime, load the array with placeholders which will be replaced on demand
NSMutableArray *controllers = [[NSMutableArray alloc] init];
for (unsigned i = 0; i < kNumberOfPages; i++)
{
    [controllers addObject:[NSNull null]];
}
self.viewControllers = controllers;
[controllers release];

// a page is the width of the scroll view
scrollView.pagingEnabled = YES;
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * kNumberOfPages, scrollView.frame.size.height);
scrollView.showsHorizontalScrollIndicator = NO;
scrollView.showsVerticalScrollIndicator = NO;
scrollView.delegate = self;
scrollView.directionalLockEnabled = YES;

currentPage = [[chapter currentPage] integerValue];


// pages are created on demand
// load the visible page
// load the page on either side to avoid flashes when the user starts scrolling
// 
// Load pages based on currentPage cause of when coming from bookmarks
[self loadScrollViewWithPage:currentPage];
[self loadScrollViewWithPage:currentPage+1];

// update the scroll view to the appropriate page
CGRect frame = scrollView.frame;
frame.origin.x = frame.size.width * currentPage;
frame.origin.y = 0;
[scrollView scrollRectToVisible:frame animated:YES];


}

- (void)loadScrollViewWithPage:(int)page
{
if (page < 0)
    return;
if (page >= kNumberOfPages)
    return;

// replace the placeholder if necessary
PageViewController *controller = [viewControllers objectAtIndex:page];
if ((NSNull *)controller == [NSNull null])
{
    //page+1 cause CGPDF indexing starts with 1
    controller = [[PageViewController alloc] initWithPageNumberAndUrl:page+1: [chapter urlOnFilesystem]];
    [viewControllers replaceObjectAtIndex:page withObject:controller];
    [controller release];
}

// add the controller's view to the scroll view
if (controller.view.superview == nil)
{
    CGRect frame = scrollView.frame;
    frame.origin.x = frame.size.width * page;
    frame.origin.y = 0;
    controller.view.frame = frame;

    [scrollView addSubview:controller.view];

}
}

Делегаты TextView

- (void)textViewDidBeginEditing:(UITextView *)textView {

NSLog(@"begin editing");
}

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString*)aText
{
NSLog(@"something changed"); 
return YES; 
}

Ответы [ 10 ]

53 голосов
/ 21 июня 2014

Просто хочу добавить еще одну возможность здесь.В симуляторе iOS убедитесь, что «Аппаратное обеспечение / Клавиатура / Подключить аппаратную клавиатуру» не отмечено.Мне понадобилось пару часов, чтобы понять это.Я думаю, что переключил эту опцию, случайно нажав на ярлык.Не очень хороший опыт: (

Menus

Как показано на рисунке, аппаратная клавиатура Connect Hardware должна быть не проверена.

4 голосов
/ 13 июня 2011

UITextView получает прикосновения?Реализуйте методы UITextViewDelegate и посмотрите, не вызваны ли они (esp textViewDidBeginEditing: и textView: shouldChangeTextInRange: replaceText: )Таким образом, вы точно будете знать, действительно ли текстовое представление обрабатывает прикосновения.

Если это так, то я не вижу ничего плохого в вашем коде (за исключением того, что вы могли случайно добавить представлениеналожение текста)

4 голосов
/ 13 июня 2011

Никто не спрашивал, но вы установили:

notes.editable = YES ; 

2 голосов
/ 18 июня 2011

Убедитесь, что в делегате вашего текстового просмотра. Следующий метод возвращает ДА.

- (BOOL)textViewShouldBeginEditing:(UITextView *)textView { return YES; }

1 голос
/ 03 июля 2014

У меня было похожее поведение: UITextView не реагирует на прикосновения и клавиатура не отображается.

Мой UITextView был наложен поверх UICollectionView, который получал все прикосновения, даже еслиUITextView было заметно сверху.

Я исправил это, отрегулировав рамку UICollectionView так, чтобы за UITextView ничего не стояло.После этого все методы делегата были вызваны как талисман.

Надеюсь, это поможет.

1 голос
/ 19 июня 2011

После того, как вы установили делегатов для заметок, сделайте следующее.

- (void)textViewDidBeginEditing:(UITextView *)textView {
    if ([textView isEqual:notes]) {
        NSLog(@"notes begin editing");
    }
}

- (BOOL)textView:(UITextView *)aTextView shouldChangeTextInRange:(NSRange)aRange replacementText:(NSString*)aText {
    if ([aTextView isEqual:notes]) {
        NSLog(@"something changed in notes");
    }

    return YES; 
}

Это должно подтвердить, что делегатов заметок действительно вызывают.

1 голос
/ 19 июня 2011

Попробуйте без container, просто используйте UITextView (notes) в качестве самого контейнера. Каждый раз, когда вы используете контейнер, используйте вместо него заметки.

А потом не:

[container addSubview:notes];
[self.view addSubview:container];

Просто:

[self.view addSubview:notes];

Скажите мне, как это происходит

1 голос
/ 15 июня 2011

Проверьте на 2 вещи:

  1. Is notes.editable = YES; если это так, пожалуйста, измените его на NO.

2.Проверьте, не вызваны ли ваши делегаты UITextView. Если нет, убедитесь, что вы включили его в файл реализации и задали notes.delegate = self.

1 голос
/ 10 июня 2011

вам нужно реализовать свой контейнерный класс с UITextViewDelegate и добавить notes.delegate = self;сразу после инициализации объекта notes в методе initNotes.

0 голосов
/ 15 июня 2017

Пожалуйста, обратитесь к этому.где ContantView - это ваше представление / текстовое поле, а _bubbletable - ваша таблица.

- (void)keyboardWasShown:(NSNotification*)aNotification
 {
 NSDictionary* info = [aNotification userInfo];
 CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

  [UIView animateWithDuration:0.2f animations:^{

    CGRect frame = _ContantView.frame;
    frame.origin.y -= kbSize.height;
    _ContantView.frame = frame;

    frame = _bubbleTable.frame;
    frame.size.height -= kbSize.height;
    _bubbleTable.frame = frame;

}];

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...