11

TextViews我努力學習UIPageViewController S和打擊,我解決不了的問題。 這就是我試圖做的:ViewControllers在UIPageViewController

  • 步驟:
    1. 我只是創造了2個視圖控制器和 故事板頁面視圖控制器。
    2. 然後,我向文件所有者PageViewController添加了一些代碼至 表現爲自身的dataSourcedelegate
    3. 當我跑步時,事情運作良好。
    4. 我在第二個視圖控制器中添加了一些按鈕和文本字段。
    5. 我跑了,效果很好。
    6. 現在我添加了一個文本視圖到第二個視圖控制器並運行。當我試圖在文本視圖內寫入內容時,頁面控件抖動並移動到第一個視圖控制器。

有沒有人有過這樣的經歷?

@interface AMPageViewController : UIPageViewController <UIPageViewControllerDataSource, UIPageViewControllerDelegate> 

@end 

實施:

#import "AMPageViewController.h" 

@interface AMPageViewController() 
{ 
    UIViewController *mainController; 
    UIViewController* socController; 
} 
@end 

@implementation AMPageViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"MainStoryboard" 
                  bundle: nil]; 

    mainController = (UIViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"First"]; 
    socController = (UIViewController*)[mainStoryboard instantiateViewControllerWithIdentifier: @"Second"]; 
    [self setViewControllers:@[mainController] 
        direction:UIPageViewControllerNavigationDirectionForward 
        animated:NO 
        completion:nil]; 
    self.dataSource = self; 
    self.delegate = self; 
    // Do any additional setup after loading the view. 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

-(UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerBeforeViewController:(UIViewController *)viewController 
{ 
    if (viewController == socController) 
     return mainController; 
    else return nil; 
} 

- (UIViewController *)pageViewController:(UIPageViewController *)pageViewController viewControllerAfterViewController:(UIViewController *)viewController 
{ 
    if (viewController == mainController) 
     return socController; 
    else return nil; 
} 

- (NSInteger)presentationCountForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return 2; 
} 

- (NSInteger)presentationIndexForPageViewController:(UIPageViewController *)pageViewController 
{ 
    return 0; 
} 


@end 

If you want to download and try the project

+0

頁面視圖控制器的延遲讓您無論是滑動或輕敲接近一個邊緣翻開新的一頁。我猜你正在擊中左側的那個輕擊手勢識別器。 – rdelmar 2013-02-21 03:58:24

+0

我不這麼認爲。請看附件項目https://dl.dropbox.com/u/62559842/PageViewcontrollerTest.zip – Bavan 2013-02-21 04:19:15

+0

是的,我明白你的意思了。它與使用滾動轉換有關。如果將其更改爲捲曲,則表現正常。 – rdelmar 2013-02-21 04:47:53

回答

7

我調查研究了很多在這個問題上。 這似乎是一個與UIPageViewController的內部(私有)UIScrollView相關的錯誤。 如果你在StackOverflow上搜索,你會發現很多帖子有這個問題,並沒有解決方案...

我似乎UITextView(這是一個UIScrollView和AFAIR,有一個內部的UIWebView)發送一些奇怪的消息它的超級鏈,使UIPageViewController的私人UIScrollView滾動到左上角。

我會試圖阻止使用方法混寫此消息,但是這可能是不正常的的AppStore。所以我嘗試了其他的東西。

最終的解決方案非常簡單:簡單地說,將UITextView嵌入到UIScrollView中!

This is a link to your project updated

如果你這樣做,你會解決這個問題!

嘗試,讓我知道

編輯:

我是如何得出這一解決方案:

一種直覺。

很多調試和堆棧跟蹤不得不讓我覺得現在的問題是有關的「嵌套UIScrollView的」系統錯誤從內以它的父發送一些信息。

的UITextView從繼承的UIScrollView和內部具有UIWebDocumentView(私有)這是另一種的UIScrollView。在調試過程中,我看到很多消息(私有方法),例如發送到上層UIScrollView的「relayout superview」。所以,出於某種原因,內部滾動視圖(UIWebDocumentView?)正在向它的超級視圖發送消息/事件。這個消息/事件(可能是因爲一個bug)並沒有停止到外部的UITextView,而是被轉發到由UIPageViewController處理的UIScrollView。

中嵌入的UITextView一個簡單的UIView內是不夠的,因爲UIView的將消息轉發到它的上海華盈,如果它不能處理。 心想:UIScrollView的可能沒有(否則就不能簡單地窩UIScrollViews),所以我想和它的工作。

這畢竟是一個假設,因爲我停下來檢查,我將在本週有了更深入的瞭解。

+0

是的。有用。 :) 謝謝。無論如何,我不知道是什麼導致你找到這個解決方案。再次感謝。 – Bavan 2013-05-06 03:18:05

+0

我加了一些細節:-) – LombaX 2013-05-06 08:06:24

0

你之前沒有設置和視圖控制器後,也來看一下,第一個響應者socController

1

構建目標iOS-7.0。

scrollview技巧不適合我。試圖通過故事板和代碼在scrollview中嵌入textview,但沒有運氣。

僅延遲調用TextView的做到了。不是很優雅,但它是我迄今爲止唯一能夠工作的東西。

- (void)viewDidAppear:(BOOL)animated 
{ 
    [super viewDidAppear:animated]; 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self.textView becomeFirstResponder]; 
    }); 
} 

經過測試,在我的iPhone 5和我的超低速iPhone4上工作。儘管無論實現細節如何使textview成爲響應者都可能花費比設定時間更長的時間,但完全有可能。所以請記住,這不完全是防彈。

- 編輯 -

嗯......它的工作在我的iPhone 4打漿機與0.0000000000000001

相關問題