2010-09-07 15 views
6

Usando el siguiente código, pongo el texto de un plist en un textView. El textView todavía no es firstresponder; el texto es inicialmente solo para lectura. En iOS4, el código goToEndOfNote coloca el cursor al final del texto Y se desplaza a esa posición. En 3.1.3 no se desplaza hasta el final hasta que se toca la pantalla (que no es necesaria a menos que se requiera un cambio o una adición), lo que hace que el textView firstresponder. Me gustaría que funcione en 3.1.3 como lo hace en 4.0. Cualquier idea, por favor Gracias.Coloque el cursor al final del texto en uitextview y desplácese a la posición

... 
    self.temp = [[[NSMutableArray alloc] initWithContentsOfFile:myPlistPath] autorelease]; 
    self.textView.text = [self.temp objectAtIndex:0]; 
    [self goToEndOfNote]; 
    //[self performSelector:@selector(goToEndOfNote) withObject:nil afterDelay:0.1]; 
} 

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
} 

Respuesta

3

utilizo setContentOffset:animated para desplazarse hasta la parte superior de un UITextView en una de mis aplicaciones. También debería funcionar para desplazarse hacia abajo. Proveedores:

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
    [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
} 

También puede envolver que hasta lo que sólo sucede por 3.1.3 y abajo:

- (void) goToEndOfNote { 
    NSUInteger length = self.textView.text.length; 
    self.textView.selectedRange = NSMakeRange(length, 0); 
    NSString* systemVersion = [[UIDevice currentDevice] systemVersion]; 
    float version = [systemVersion floatValue]; 
    if (version < 3.2) { 
     [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
    } 
} 
+0

Casi no es del todo. La vista de texto es la mayor parte de la pantalla. En 4.0, la línea adicional [textView setContentOffset: CGPointMake (0, longitud) animada: YES]; hace que el último carácter se desplace hasta la parte inferior de textView (bueno). En 3.1.3, hace que el último carácter se desplace aproximadamente a mitad de camino en la pantalla (ok), pero en ambas versiones del sistema operativo, si solo hay 1 o 2 líneas en la pantalla, se desplazan fuera de la pantalla (no tan bueno). Prefiero desplazarme para comenzar solo después de que haya una pantalla (como en 4.0 con solo las 2 líneas originales en mi método). –

2

No estoy seguro si esta es la respuesta, pero funciona.

En 3.1.3, con el código original, el cursor estaba al final pero el desplazamiento estaba en la parte superior. En 4.0, ambos estaban en la parte inferior.

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(length, 0); 

entonces notado que en 3.1.3, el cambio de la longitud y el 0, el desplazamiento era en la parte inferior pero el cursor fue en la parte superior.

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(0, length); 

Poniendo las dos juntas trabajadas. Se desplaza a la parte inferior NSMakeRange (0, longitud) presumiblemente para el extremo superior del rango, entonces el NSMakeRange (longitud, 0) pone el cursor allí, todo sin ningún cambio en lo que hace en 4,0

NSUInteger length = self.textView.text.length; 
self.textView.selectedRange = NSMakeRange(0, length); 
self.textView.selectedRange = NSMakeRange(length, 0); 
1

Usted puede usar [UITextView -setSelectedRange:] para establecer un rango (ubicación = TEXT_VIEW_STRING_LENGTH, longitud = 0) para llevar el cursor hasta el final del texto, y luego llamar al [UITextView -scrollRangeToVisible:] con el mismo rango para desplazar el cursor a visible.

1

Es tarde pero encontré la solución de trabajo para esto. necesita un pequeño truco

- (void) textViewDidBeginEditing:(UITextView*)textview 
{ 
    [self performSelector:@selector(placeCursorAtEnd:) withObject:textview afterDelay:0.01]; 
} 

- (void)placeCursorAtEnd:(UITextView *)textview 
{ 
    NSUInteger length = textview.text.length; 

    textview.selectedRange = NSMakeRange(length, 0); 

    [textView setContentOffset:CGPointMake(0, length) animated:YES]; 
} 
+0

Mucho más limpio cuando usa 'dispatch_after()' porque guarda un método y mantiene el disparador y la acción juntos. –

Cuestiones relacionadas