2012-03-02 32 views
2

我一直在玩UITableView一段時間,並在擊中鍵盤和滾動的問題,我決定通過使用UITableViewController解決它,利用當鍵盤出現時自動滾動。不幸的是,這不會發生在我身上,我無法弄清楚爲什麼,我嘗試了很多東西,並放棄向社區提出問題。UITableViewController不自動滾動與鍵盤一旦擁有TableView被推上UIViewController的子視圖

這是我到目前爲止有:

  1. 定期UIViewController處理一個UIViewMyView.xib)(這是 也根視圖)
  2. 定期UITableViewController處理一個 UITableView在單獨的XIB文件(MyTable.xib)中
  3. 常規UITableViewCell已被拖入(MyTable.xib)並與並排居住。這UITableViewCell沒有自定義類。還有一個連接到UITableViewController類的插座。
  4. 定期UITextField位於下UITableViewCell
  5. 我在MyTable.xib相關文件的所有者身份對UITableViewController
  6. 我已經連接了UITableView的委託和數據源,以文件的所有者

這是它的外觀在IB在MyTable.xib

  • UITableView
  • UITableViewCell
    • UITextField

所以,當我在的UITableViewController生成我的錶行,我出列第5行是常規電池和最後一行我回到我的出口「了myCell」 (UITableViewCell中)。這是具有UITextField的那個。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    if (indexPath.row == 5) return myCell; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    cell.textLabel.text = [NSString stringWithFormat:@"Test"]; 

    return cell; 
} 

最後,我ViewControllerviewDidLoad,我創建了UITableViewController的實例並顯示它。它成功地顯示了5行,並在底部顯示了我的自定義行。所有在主視圖,但是......

- (void)viewDidLoad 
{ 
[super viewDidLoad]; 

mtc = [[MortgageTableController alloc] initWithNibName:@"MyTable" bundle:nil]; 
mtc.view.frame = CGRectMake(0, 44, 320, 375); 
[self.view addSubview:mtc.view]; 
} 

我遇到的,如果我點擊UITextField,我沒有看到在視圖中自動滾屏表中的問題。我認爲這是使用UITableViewController的優勢之一,或者我可能在這裏做錯了什麼。

我也嘗試選擇和/或滾動表格到行,但沒有運氣。

+0

的子類,提出和回答。 http://stackoverflow.com/questions/5265559/get-uitableview-to-scroll-to-the-selected-uitextfield-and-avoid-being-hidden-by – dbrajkovic 2012-03-02 05:33:40

回答

12

您需要調用super viewWillAppear才能自動滾動。

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    // your code 
} 

編輯:7月19日,對於這項工作的前提是,你的控制器的UITableViewController

+1

非常感謝!我想知道爲什麼它在一個視圖上如此輕鬆地工作,而不是另一個!我在其他地方看到了一些繁瑣的代碼,重新整理鍵盤的整個視圖... – Chicken 2014-07-04 08:34:22

+0

@Chicken歡迎:) – Songlin 2014-07-10 07:13:31

+0

完美的答案!很簡單。 – Jorge 2014-11-11 12:02:47

1

當您將tableView嵌入到superView中時,您不會獲得表視圖控制器的典型行爲。在控制全屏幕tableView(例如在導航控制器上推送)時,如果視圖控制器發生什麼情況,表格視圖會在出現鍵盤時調整大小。

由於你主要是一個視圖控制器,你必須做的工作:添加你的視圖控制器或你的表視圖控制器作爲鍵盤通知觀察者和滾動你的表視圖到你需要的位置。

+1

謝謝你的迴應。這是一個非常令人驚訝的設計。你說的是,一旦我將一個TableView添加到UIViewController(父級)的子視圖中,即使它的所有功能都是由UITableViewController(子級)控制的,我不會得到子級的交互行爲嗎?因此,在導航控制器上推送tableView不同於在父UIViewController上推送tableView? 我已經嘗試了你的建議,但滾動看起來比我喜歡的更小,因此我想嘗試在UITableViewController的函數中構建。 – bendigi 2012-03-02 18:08:21

+0

我也有這個問題,這有助於很多: 'TPKeyboardAvoiding' https://github.com/michaeltyson/TPKeyboardAvoiding – Marc 2012-04-10 09:54:49

+0

是否真的添加一個tableview控制器不會自動滾動,當你把它放在一個uiviewcontroller?你有沒有任何參考說明?對我來說,自動滾動在我的示例項目中工作,但不在我的真實項目中,好奇地知道細微之處。 – Vignesh 2012-09-03 09:24:18

0

我遇到了類似的問題,但我使用的是tableviewcontroller,所以我應該得到免費的tableview抵消行爲。問題原來是我打電話給[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow) name:UIKeyboardDidShowNotification object:nil];。我相信這導致tableviewcontroller不會收到此通知(我想可能一個對象只能爲每個notif註冊1個方法)。將上面的內容更改爲[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow) name:UIKeyboardWillShowNotification object:nil];解決了我的問題。

相關問題