2016-01-26 15 views
5

mam UITableView że zawiera UITextField w każdej komórce
Kiedy klikam UITextField w komórce, klawiatura pokaże i przykryć moją komórkę. Dlatego przenoszę komórkę na górę za pomocą.IOS Kliknij dwukrotnie Przyczyna komórek w UITableView nie będzie przewijać

- (void)keyboardWasShown:(NSNotification*)aNotification 
{ 
    CGPoint scrollPoint = CGPointMake(0, self.activeInputView.frame.origin.y); 
    [self.tableView setContentOffset:scrollPoint animated:YES]; 
} 

Jeśli używam pojedyncze kliknięcie w każdej komórce, moja praca aplikacji w porządku.
Jednak używam kliknij dwukrotnie na każdej komórce (to znaczy, że dotknę go 2 razy bardzo szybko), moja komórka przestanie przewijać do góry.

+0

kliknij dwukrotnie swoje pole tekstowe w komórce? – Tj3n

+0

oznacza, że ​​stukam w nią 2 razy. –

+0

Czy nie można wyłączyć interakcji użytkownika w polu tekstowym podczas przewijania widoku tabeli? – Randy

Odpowiedz

1

a następnie robi kod do ręcznego ustawiania ramki Tableview, Podam sugestię, można użyć IQKeyboardManager którego pod jest dostępny w cocoapods i będzie zarządzać z po kliknięciu na polu tekstowym komórki, tableview automatycznie przewijać.

+0

dziękuję za sugestię, ale chcę sobie z tym poradzić. Ponieważ po kliknięciu wyświetli autouzupełnianie tableview poniżej pola tekstowego –

2

TPKeyboardAvoiding wydaje się być rozwiązaniem.

1

Spróbuj użyć trzeciej biblioteki IQKeyboardManager, która pomoże ci rozwiązać ten problem.

https://github.com/hackiftekhar/IQKeyboardManager

Wymień następujący kod w pliku AppDelegate.m i wtedy nie trzeba używać metody Scrollview do obsługi klawiatury: -

@implementation AppDelegate 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    [[IQKeyboardManager sharedManager] setEnable:YES]; 

    [self.window makeKeyAndVisible]; 
    return YES; 

} 
3

W tej linii

CGPoint scrollPoint = CGPointMake(0, self.activeInputView.frame.origin.y);

może być 2 błędy.

Po pierwsze, musisz upewnić się, że przechwycony inputView jest pożądanym widokiem. Po drugie, należy przekonwertować pobrany punkt na poprawny widok za pomocą odpowiedniej metody.

See referencyjny: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIView_Class/#//apple_ref/doc/uid/TP40006816-CH3-SW52

do dalszych badań potrzeba więcej kontekstu.

2

Czy jesteś pewien, że scrollPoint jest poprawny?

Właśnie utworzyłem przykładowy projekt ze stałym przesunięciem i wszystko działa idealnie dobrze. Widok tabeli przewija się w górę po pojedynczym i dwukrotnym kliknięciu na UITextField określonego UITableViewCell.

- (void)keyboardDidShow:(NSNotification *)notification { 
    CGPoint point = CGPointMake(0.0, 30.0); 
    [self.tableView setContentOffset:point animated:YES]; 
} 
1

Czy utworzyłeś oddzielną klasę UITableViewCell?

Wierzę, że podczas przewijania UITableView twój interfejs użytkownika zawiesza się lub gdy zakładasz dwa razy częściej twój UITableView przestaje odpowiadać lub poświęca czas na odpowiedź.

0

Oto działający przykład. Korzystasz z właściwości przewijania, aby uniknąć klawiatury, gdy się pojawi. Powinieneś zarejestrować się, aby otrzymywać powiadomienia z klawiatury.Użyj informacji w powiadomieniach, aby określić rozmiar klawiatury - nigdy nie wiesz, co to będzie.

Używanie wkładki zawartości jest właściwym sposobem postępowania z tym widokiem przewijania. Jeśli następnie trzeba przewijać edycji wiersz do widoku, użyj UITableView.scrollToRowAtIndexPath (_ :, atScrollPosition :, animowana :)

Zauważ, że robi to, co trzeba, gdy użytkownik ukrywa/pokazuje pasek uzupełnień.

import UIKit 
import CoreGraphics 

// our Cell class 
class Cell : UITableViewCell 
{ 
    // cell reuse identifier for table view 
    static let Identifier = "Cell" 

    // the object the cell represents/displays. Could be anything you like 
    var value:AnyObject? { 
     didSet { 
      // update our text field when our cell value is set. 
      self.textField.text = value as? String 
     } 
    } 

    // use a text field to display our contents, since that allows editing and showing the keyboard 
    lazy var textField:UITextField = { 
     let textField = UITextField() 
     self.contentView.addSubview(textField) 
     return textField 
    }() 

    override func layoutSubviews() { 
     super.layoutSubviews() 
     self.textField.frame = contentView.bounds.insetBy(dx: 20, dy: 4) 
    } 
} 

// table view data source class 
class DataSource : NSObject, UITableViewDataSource 
{ 
    var numberOfRows:Int { return items.count } 
    let items = [ "Seoul", "São Paulo", "Bombay", "Jakarta", "Karachi", "Moskva", "Istanbul", "Mexico", "Shanghai", "Tokyo", "New" York, "Bangkok", "Beijing", "Delhi", "London", "Hong Kong", "Cairo", "Tehran", "Bogota", "Bandung", "Tianjin", "Lima", "Rio de Janeiro", "Lahore", "Bogor", "Santiago", "St Petersburg", "Shenyang", "Calcutta", "Wuhan" ] 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     return numberOfRows 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let cell = tableView.dequeueReusableCellWithIdentifier(Cell.Identifier) as? Cell ?? Cell() 
     cell.value = items[ indexPath.row ] 
     return cell 
    } 
} 

class ViewController : UIViewController 
{ 
    override func viewDidLoad() { 
     super.viewDidLoad() 
     // register for notifications when the keyboard appears: 
     NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillChangeFrameNotification, object: nil) 
    } 
    override func viewDidLayoutSubviews() { 
     tableView.frame = view.bounds 
    } 

    lazy var tableView:UITableView = { 
     let tableView = UITableView() 
     self.view.addSubview(tableView) 
     tableView.dataSource = self.dataSource 
     tableView.delegate = self 
     return tableView 
    }() 

    lazy var dataSource : DataSource = DataSource() 

    // Handle keyboard frame changes here. 
    // Use the CGRect stored in the notification to determine what part of the screen the keyboard will cover. 
    // Adjust our table view's contentInset and scrollIndicatorInsets properties so that the table view content avoids the part of the screen covered by the keyboard 
    @objc func keyboardWillShow(note:NSNotification) 
    { 
     // read the CGRect from the notification (if any) 
     if let newFrame = (note.userInfo?[ UIKeyboardFrameEndUserInfoKey ] as? NSValue)?.CGRectValue() { 
      let insets = UIEdgeInsetsMake(0, 0, newFrame.height, 0) 
      tableView.contentInset = insets 
      tableView.scrollIndicatorInsets = insets 
     } 
    } 
} 

// need to conform to UITableViewDelegate protocol since we are the table view's delegate 
extension ViewController : UITableViewDelegate 
{ 
} 

// App set up stuff here: 
@UIApplicationMain 
class AppDelegate: UIResponder, UIApplicationDelegate { 

    lazy var window:UIWindow? = UIWindow() 


    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { 

     window!.rootViewController = ViewController() 
     window!.makeKeyAndVisible() 
     return true 
    } 
} 
Powiązane problemy