2012-11-06 41 views
0

我是一個剛剛開始製作我的第一個應用程序而沒有遵循書或教程的新手。我創建了一個簡單的應用程序,該應用程序在啓動時顯示一個UITableView,其中包含一個標題中有文本字段且最初沒有行的單個部分。當您在文本字段中輸入一些文本時,它會進行Web API調用(從維基百科獲取一些JSON數據),然後用調用結果填充表格行。通常,有足夠的結果,表格的底部不再可見在屏幕上。一切都很好,直到我試着滾動桌子。發生這種情況時,屏幕右側邊緣不會出現滾動條,而且手指移動時表格不會以一對一的比例移動。當我釋放手指時,表格會回到頂部,以便文本字段再次位於屏幕的頂部 - 所以基本上它的行爲方式與在任何行或足夠少的行之前行爲相同屏幕上。我上午發送reloadData到新的數據進來後的表視圖 - 我需要發送一些其他消息通知它,它的大小已經改變或什麼?將行添加到UITableView後發生意外的滾動行爲

編輯:我已經在MacRumors的論壇上發佈了同樣的問題,以及我的項目文件。請give it a look並下載項目文件,如果你認爲它可以幫助你。

+0

當你說 「填充錶行」,什麼是真正發生的代碼? (通常,有一種爲表提供數據的數組,如果向數組添加新對象並調用'reloadData',通常它會「正常工作」......只要您的表數據源方法返回正確的東西。) –

+0

是的,我基本上有一個NSArray,它包含行的數據,還有一個'tableView:cellForRowAtIndexPath:'的實現,它爲數組中的每個對應項目提取一個單元格。我的'connectionDidFinishLoading:'實現解析提取的數據並用它填充數據數組。 –

回答

3

從您的WordsHeaderView筆尖文件中刪除「使用自動佈局」。 單擊筆尖文件,進入「文件檢查器」並取消選中「使用自動佈局」。 您在標題視圖中有一些自動佈局約束,「鎖定」表滾動

+0

我發現File Inspector窗格下的複選框而不是Identity Inspector,但取消選中該框後,所有內容都按預期工作。謝謝,並享受你的+50!我會去做一些關於那個複選框正在做什麼的研究,所以它不會在將來破壞我。 –

+0

哦,你是正確的:)回答編輯。謝謝 – LombaX

0

而不是將其添加爲「viewForHeaderInSection」,您是否嘗試將其設置爲「tableHeaderView」。 可能如下。

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    tableView.tableHeaderView = [self headerView]; 
    return 1; 
} 
+0

以這種方式設置標題是標準還是正確的做法?它讓我覺得自己像是黑客。 –

1

在你WTAppDelegate.m變化 - (BOOL)申請:(UIApplication的*)應用程序didFinishLaunchingWithOptions:(NSDictionary的*)launchOptions

到以下

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
    WordsViewController *viewController = [[WordsViewController alloc] init]; 
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:viewController]; 
    [[self window] setRootViewController:navController]; 
    self.window.backgroundColor = [UIColor whiteColor]; 
    [self.window makeKeyAndVisible]; 
    return YES; 
} 

然後WordsViewController.m評論方法 - (id)initWithStyle:(UITableViewStyle)風格和 - (id)init並添加以下方法

-(void)loadView{ 
    [super loadView]; 
} 
+0

如果我不需要一個UINavigationController,爲什麼要實現它?這只是一個標準的做法或什麼?另外,loadView的實現不會執行相同的事情,就像它沒有實現一樣 - 也就是說,只是調用它的超級實現? –

+0

哦,你是正確的,沒有必要添加loadView方法。最好的做法是在導航控制器中使用tableviewcontroller。如果你不想實現它,那麼有另一種方法可以在表視圖中添加標題。 – iDK

0

在你WTAppDelegate.m變化 - (BOOL)申請:(UIApplication的*)應用程序didFinishLaunchingWithOptions:(NSDictionary的*)launchOptions

到以下

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
     self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]]; 
     WordsViewController *viewController = [[WordsViewController alloc] init]; 
     [[self window] setRootViewController:viewController]; 
     [self.window makeKeyAndVisible]; 
     return YES; 
} 

註釋掉以下從WordsViewController.m

方法
  1. - (ID)initWithStyle:(UITableViewStyle)風格
  2. - (ID)初始
  3. - (UIView的*)headerView
  4. - (UIView的*)的tableView:(UITableView的*)的tableView viewForHeaderInSection:(NSInteger的)部分
  5. - (CGFloat的)的tableView:(UITableView的*)的tableView heightForHeaderInSection:(NSInteger的)部分

無需添加loadView方法。

在WordsViewController.m增加以下內容 - (無效)viewDidLoad中

添加

wordsHeaderView = [[[NSBundle mainBundle] loadNibNamed:@"WordsHeaderView" owner:self options:nil] lastObject]; 
self.tableView.tableHeaderView = wordsHeaderView;