11

में टेक्स्ट व्यू के साथ व्यू कंट्रोलर मैं UIPageViewController एस सीखने की कोशिश कर रहा था और एक समस्या जिसे मैं हल नहीं कर सका। यह मैं करने की कोशिश की क्या है:UIPageViewController

  • कदम:
    1. मैं बस 2 दृश्य नियंत्रक बनाया है और स्टोरीबोर्ड में एक पृष्ठ दृश्य नियंत्रक।
    2. फिर मैंने PageViewController से पर dataSource और delegate के रूप में व्यवहार करने के लिए फ़ाइल के स्वामी को कुछ कोड जोड़ा।
    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

पृष्ठ दृश्य नियंत्रकों की देरी से अपने iPhone 4 बीटर पर काम कर रहा है या तो आप स्वाइप या एक किनारे के पास दोहन से पेज चालू करने के लिए अनुमति देते हैं। मुझे लगता है कि आप बाईं ओर उस टैप इशारा पहचानकर्ता को मार रहे हैं। – rdelmar

+0

मुझे ऐसा नहीं लगता है। कृपया संलग्न प्रोजेक्ट पर एक नज़र डालें https://dl.dropbox.com/u/62559842/PageViewcontrollerTest.zip – Bavan

+0

हाँ, मुझे लगता है कि आपका क्या मतलब है। स्क्रॉल संक्रमण का उपयोग करने के साथ इसका कुछ संबंध है। यदि आप इसे कर्ल में बदलते हैं, तो यह सामान्य रूप से व्यवहार करता है। – rdelmar

उत्तर

7

के लिए पहले प्रत्युत्तर करने के पहले सेट नहीं था और दृश्य नियंत्रकों के बाद और भी देखो मैं एक बहुत की जांच की है इस समस्या पर। यह UIPageViewController के आंतरिक (निजी) UIScrollView से संबंधित एक बग लगता है। आप StackOverflow आप इस समस्या को और कोई समाधान के साथ पद का एक बहुत मिल जाएगा पर खोज करते हैं ...

मैं लगता है कि UITextView (जो एक UIScrollView और, AFAIR है, एक आंतरिक UIWebView है), कुछ अजीब संदेश भेजता है इसकी पर्यवेक्षी श्रृंखला में, जो UIPageViewController के निजी UIScrollView को शीर्ष-बाएं कोने में स्क्रॉल करता है।

मैं विधि स्विजलिंग का उपयोग करके इस संदेश को अवरुद्ध करने का प्रयास करता, लेकिन यह शायद ऐपस्टोर के लिए ठीक नहीं है। तो मैंने अन्य चीजों की कोशिश की।

अंतिम समाधान बहुत आसान है: बस, UIScrollView के अंदर अपना UITextView एम्बेड करें!

This is a link to your project updated

यदि आप ऐसा करते हैं, तो आप समस्या को हल करेंगे!

प्रयास करें और मुझे पता है

संपादित करते हैं:

कैसे मैं इस समाधान के लिए आए:

एक अंतर्ज्ञान।

बहुत सारे डीबग और स्टैक निशान मुझे सोचते थे कि समस्या "घोंसले UIScrollView" सिस्टम में एक बग से संबंधित थी और आंतरिक दृश्य से भेजे गए कुछ संदेश इसके पर्यवेक्षण में थे।

UITextView UIScrollView से विरासत में मिलता है और इसमें UIWebDocumentView (निजी) है जो एक और UIScrollView है। डीबग के दौरान मैंने ऊपरी UIScrollView के लिए भेजे गए "रिलेआउट पर्यवेक्षण" जैसे कई संदेश (निजी विधियों) को देखा। तो, किसी कारण से, आंतरिक स्क्रॉल व्यू (UIWebDocumentView?) इसके पर्यवेक्षण में एक संदेश/ईवेंट भेज रहा था। यह संदेश/घटना (संभवतः एक बग के कारण) बाहरी UITextView को रोक नहीं रही थी, और UIPageViewController द्वारा प्रबंधित UIScrollView को अग्रेषित किया गया था।

एक साधारण UIView के अंदर UITextView को एम्बेड करना पर्याप्त नहीं था, क्योंकि UIView संदेश को इसके पर्यवेक्षण में अग्रेषित करता है अगर यह संभाल नहीं सकता है। मैंने सोचा: UIScrollView शायद नहीं है (अन्यथा यह UIScrollViews घोंसला आसान नहीं होगा), इसलिए मैंने कोशिश की और यह काम किया।

यह सब एक अनुमान है क्योंकि मैंने निरीक्षण बंद कर दिया है, इस सप्ताह मेरे पास अधिक गहराई से नजर आएगी।

+0

हां। यह काम करता हैं। :) धन्यवाद। वैसे भी, मुझे इस समाधान को खोजने के लिए आपको क्या हो सकता है इसके बारे में कोई जानकारी नहीं है। एक बार फिर धन्यवाद। – Bavan

+0

मैंने कुछ विवरण जोड़े :-) – LombaX

1

लक्ष्य आईओएस-7.0 बनाएं।

स्क्रॉलव्यू चाल मेरे लिए काम नहीं कर रही थी। स्टोरीबोर्ड और कोड के माध्यम से स्क्रॉलव्यू में टेक्स्टव्यू को एम्बेड करने का प्रयास किया लेकिन कोई किस्मत नहीं।

बस टेक्स्टव्यू पर कॉल में देरी हुई। बहुत सुरुचिपूर्ण नहीं है, लेकिन यह एकमात्र चीज है जिसे मैंने अभी तक काम करने के लिए प्राप्त किया है।

- (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]; 
    }); 
} 

परीक्षण किया गया, मेरे आईफोन 5 और मेरे अति धीमी आईफोन 4 पर काम किया। यद्यपि यह पूरी तरह से संभव है कि जो भी कार्यान्वयन विवरण टेक्स्टव्यू को उत्तरदाता बनने में सक्षम बनाता है, वह निर्धारित समय से अधिक समय ले सकता है। तो ध्यान रखें कि यह वास्तव में बुलेटप्रूफ नहीं है।

--EDIT--

खैर ... यह 0.0000000000000001