2011-10-25 11 views
7

पृष्ठभूमि & उद्देश्य: मेरे पास UISplitViewController आधारित आईपैड ऐप है - अब तक यह 4 ओरिएंटेशन का समर्थन करता है लेकिन अब मैं इसे केवल लैंडस्केप पर लॉक करना चाहता हूं। मैंने केवल लैंडस्केप मोड का समर्थन करने के लिए बाएं व्यू कंट्रोलर के shouldAutorotateToInterfaceOrientation को बदल दिया, लेकिन यह viewWillAppear को कॉल करने से रोकता है।ViewWillAppear UISplitViewController

विवरण: मेरे iPad के दृश्य नियंत्रक नीचे व्यवस्थित होते हैं:

- (BOOL)application:(UIApplication *)application 
     didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { 
    HostManagerViewController *hvc = [[[HostManagerViewController alloc] 
             initWithNibName:nil bundle:nil] autorelease]; 
    self.detailViewController = [[[DetailViewController alloc] 
           initWithNibName:nil bundle:nil] autorelease]; 
    UINavigationController *rootNav = [[[UINavigationController alloc] 
             initWithRootViewController:hvc] autorelease]; 
    UISplitViewController *splitVC= [[[UISplitViewController alloc] init] autorelease]; 
    [splitVC setViewControllers:[NSArray arrayWithObjects:rootNav, 
           detailViewController, nil]]; 

    splitVC.delegate = detailViewController; 
    [window addSubview:splitVC.view]; 
    [window setRootViewController:splitVC]; 
    return YES; 
} 

viewWillAppear कहा जाता हो जाता है जब दोनों DetailViewController.m और HostManagerViewController.m

होते हैं:

window 
`-- splitVC (UISplitViewController) 
    `-- rootNav (UINavigationController) 
     `-- hvc (HostManagerViewController, derived from UIViewController) 
    `-- detailViewController (DetailViewController, derived from UIViewController) 

यह नीचे के रूप में अनुप्रयोग प्रतिनिधि में कार्यान्वित किया जाता

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 
Console output: 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 3 
Hostmanager: Viewdidload 
Should rotate called to hostmanager with 1 
Hostmanager: viewwillappear 

लेकिन जब मैं '

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (UIInterfaceOrientationIsLandscape(interfaceOrientation)); 
} 

फिर रों कोड' HostManagerViewController बदलने HostManagerViewController की viewWillAppear` लागू नहीं है। कंसोल आउटपुट

Should rotate called to hostmanager with 1 (1 is the numeric value of interfaceOrientation) 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 3 
Should rotate called to hostmanager with 3 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 3 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 3 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 1 
Should rotate called to hostmanager with 3 
Hostmanager: Viewdidload 
Should rotate called to hostmanager with 1 

केवल लैंडस्केप मोड Info.plist

संपादित में समर्थित हैं: सम्मिलित NSLog संदेशों shouldAutorotateToInterfaceOrientation, viewWillAppear और ViewDidLoad

+0

क्या आपके लिए इस परियोजना का नमूना अपलोड करना संभव है? – ACBurk

+0

आप इसे किस आईओएस संस्करण पर चल रहे हैं? – ACBurk

+0

मैं 4.3 का उपयोग कर रहा हूँ। इसे एक छोटे टेस्टकेस को कम करना किया जा सकता है। मैं इसे कहां अपलोड करूं? –

उत्तर

8

मैंने पूछा क्या iOS संस्करण आप उपयोग कर रहे थे, क्योंकि मैं आपकी समस्या का एक सरल प्रजनन बनाने की कोशिश की और पाया: HostManagerViewController में shouldAutorotateToInterfaceOrientation allways वापस जाने के लिए हाँ और DetailViewController में मैं जोड़ना होगा - मैं बदल जाएगा व्यवहार 4.3 और 5.0 के बीच अलग है।यह वास्तव में 5.0 में सभी सही कॉल करता है। मुझे विश्वास है कि यह बस UISplitviewController के साथ एक बग बनने के लिए है। स्प्लिटव्यू नियंत्रक काफी छोटी थी। Aopsfan का जवाब समस्या का समाधान नहीं करता है (मैंने इसकी पुष्टि की है)। मैं उपवर्गीकरण uisplitviewcontroller सुझाव है, और SPLITVIEW नियंत्रक के viewwillappear अधिभावी, इसलिए जैसे viewdidappear:

#import "testSplitViewController.h" 

@implementation testSplitViewController 

-(void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    NSString *reqSysVer = @"5.0"; 
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] == NSOrderedAscending) 
     [[[self viewControllers] objectAtIndex:0] viewWillAppear:animated]; 
} 

-(void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    NSString *reqSysVer = @"5.0"; 
    NSString *currSysVer = [[UIDevice currentDevice] systemVersion]; 
    if ([currSysVer compare:reqSysVer options:NSNumericSearch] == NSOrderedAscending) 
     [[[self viewControllers] objectAtIndex:0] viewDidAppear:animated]; 
} 
@end 

आप संस्करण संख्या की जांच करने के लिए इतना है कि आप viewDidAppear कॉल दो बार नहीं बनाते हैं है।

या यदि आप कर सकते हैं तो बस 5.0 या ऊपर के साथ जाएं, क्योंकि बग ठीक होने लगते हैं।

+0

हां, हाँ और हाँ! स्प्लिट व्यू कंट्रोलर में एक बग प्रतीत होता है - इसलिए विभाजित दृश्य से बच्चों के विचारों पर 'व्यूविल्लएपियर' को मजबूर करना वर्कअराउंड लगता है। बहुत धन्यवाद, @ACBurk –

+0

'viewDidAppear' को कॉल करने से पहले संस्करण जांच से अधिक सामान्य तरीका है? 'IsViewLoaded' है, लेकिन क्या वहां एक' हैवी व्यूपेर्ड 'कॉल भी है? –

+0

नहीं कि मुझे अपने सिर के ऊपर से पता है, लेकिन मैं इसे देखूंगा – ACBurk

3

ट्रैक करने के लिए मूल रूप से, के बाद से एक UISplitViewController के दो भाग हैं, आप की जरूरत Autorotate का एक सार्वभौमिक कार्यान्वयन। मुझे लगता है कि दृश्य नियंत्रकों के घूर्णन से निपटने से अलग-अलग कुछ अजीब पक्ष प्रभावित हो सकते हैं - हालांकि कृपया ध्यान दें कि मैं आपके viewWillAppear समस्या को दोहराने में सक्षम नहीं था, इसलिए यह समाधान वास्तव में अनुमान है।

मैं UISplitViewController के मृत-सरल उप-वर्ग बनाने की अनुशंसा करता हूं। नाम यह "SplitViewController", और यह .m फ़ाइल है में, shouldAutorotate के अलावा सब कुछ है, जो इस तरह दिखेगा हटाएँ:

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

अब: अब वापस करने के लिए HostManagerViewController और DetailViewController में अपने shouldAutorotate कोड बदलने

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return (UIInterfaceOrientationIsLandscape(interfaceOrientation)); 
} 

, अपने ऐप प्रतिनिधि में, UISplitViewController के बजाय इस कक्षा का उपयोग करें। यह आपकी समस्या को ठीक कर सकता है (मई)।

+0

मैं aopsfan से भी सहमत हूं, आपको इसे प्रत्येक व्यू कंट्रोलर पर अवरुद्ध नहीं करना चाहिए, आपको रूट नियंत्रक (आपके मामले में UISplitViewController) में इसे अवरुद्ध करना चाहिए। – alinoz

+0

+1 इस सुझाव के लिए धन्यवाद। दुर्भाग्यवश, इसने समस्या को हल नहीं किया –

0

आप detailViewController

splitVC.delegate = detailViewController; 

को UISplitViewControler के प्रतिनिधि सेट मैं रोटेशन ब्लॉक करने के लिए DetailViewController में और HostManagerViewController में नहीं होगा सबसे अच्छी जगह है।

-(BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation 
{ 
    return (UIInterfaceOrientationIsLandscape == interfaceOrientation); 
} 
संबंधित मुद्दे