คำถามติดแท็ก uiviewcontroller

คลาส UIViewController จะจัดการมุมมองในแอพ iOS และเป็นสื่อกลางในการโต้ตอบระหว่างมุมมองของแอพอ็อบเจ็กต์โมเดลพื้นฐานและเวิร์กโฟลว์โดยรวม

4
ฉันจะสร้างคลาสมุมมอง iOS ที่กำหนดเองและสร้างอินสแตนซ์สำเนาหลายชุด (ใน IB) ได้อย่างไร
ฉันกำลังสร้างแอพที่จะมีตัวจับเวลาหลายตัวซึ่งโดยพื้นฐานแล้วจะเหมือนกันทั้งหมด ฉันต้องการสร้างคลาสแบบกำหนดเองที่ใช้โค้ดทั้งหมดสำหรับตัวจับเวลาตลอดจนเค้าโครง / ภาพเคลื่อนไหวดังนั้นฉันจึงมีตัวจับเวลาที่เหมือนกัน 5 ตัวที่ทำงานแยกกัน ฉันสร้างเลย์เอาต์โดยใช้ IB (xcode 4.2) และโค้ดทั้งหมดสำหรับตัวจับเวลาขณะนี้อยู่ในคลาส viewcontroller ฉันมีปัญหาในการห่อสมองของฉันเกี่ยวกับวิธีการห่อหุ้มทุกอย่างลงในคลาสที่กำหนดเองแล้วเพิ่มลงในตัวควบคุมมุมมองความช่วยเหลือใด ๆ จะได้รับการชื่นชมมาก

7
วิธีรับตัวควบคุมมุมมองรูท
ฉันต้องการอินสแตนซ์ของตัวควบคุมมุมมองรูท ฉันลองวิธีการเหล่านั้น: UIViewController *rootViewController = (UIViewController*)[[[UIApplication sharedApplication] keyWindow] rootViewController]; ผลตอบแทน: null : นอกจากนี้เมื่อฉันพยายามรับอาร์เรย์ของคอนโทรลเลอร์: NSArray *viewControllers = self.navigationController.viewControllers; ส่งคืนคอนโทรลเลอร์เพียงตัวเดียว แต่ไม่ใช่ตัวควบคุมมุมมองรูทของฉัน หากฉันพยายามใช้ตัวควบคุมการนำทาง: UIViewController *root = (UIViewController*)[self.navigationController.viewControllers objectAtIndex:0]; ผลตอบแทน: null : ความคิดใด ๆ ทำไม? ฉันจะลองใช้อินสแตนซ์ของตัวควบคุมมุมมองรูทของฉันได้อย่างไร ขอบคุณ.

2
View Controller Containment ทำงานอย่างไรใน iOS 5
ในงาน WWDC 2011 เซสชัน 102, Apple เปิดดูควบคุมกักกันซึ่งเป็นความสามารถในการสร้างมุมมองที่กำหนดเองภาชนะควบคุมคล้ายคลึงกับUITabBarController, UINavigationControllerและไม่ชอบ ฉันดูตัวอย่างหลายครั้ง มีวิธีการที่ยุ่งยากที่เกี่ยวข้องกับรูปแบบนี้ แต่ก็ยากเล็กน้อยที่จะเข้าใจอย่างแน่ชัด ฉันจะโพสต์สิ่งที่ฉันคิดไว้ที่นี่และดูว่าชุมชนจะยืนยันหรือไม่ยืนยันความสงสัยของฉัน สถานการณ์ที่ 1: การย้ายจากผู้ปกครองไปยังตัวควบคุมมุมมองหลักใหม่ [vc willMoveToParentViewController:self]; [self addChildViewController:vc]; [self.view addSubview:vc.view]; // or something like this. [vc didMoveToParentViewController:self]; สองบรรทัดแรกต้องเกิดขึ้นตามลำดับที่กำหนดหรือสามารถย้อนกลับได้หรือไม่? สถานการณ์ที่ 2: การย้ายจากตัวควบคุมมุมมองหลักไปยังไม่มีตัวควบคุมมุมมองหลัก [vc willMoveToParentViewController:nil]; [vc.view removeFromSuperview]; [vc removeFromParentViewController]; ยังจำเป็นต้องโทร[vc didMoveToParentViewController:nil]? ตัวอย่างในเซสชัน 102 ไม่ได้ทำสิ่งนี้ในสถานการณ์นี้ แต่ฉันไม่รู้ว่านั่นเป็นการละเว้นหรือไม่ สถานการณ์ที่ 3: การย้ายจากตัวควบคุมมุมมองหลักไปยังอีกตัวหนึ่ง สิ่งนี้อาจเกิดขึ้นในลักษณะต่อไปนี้เนื่องจากตรรกะในตัวควบคุมมุมมองหลักแต่ละตัวจะถูกห่อหุ้ม // In …

8
วิธีการเปลี่ยนหัวเรื่อง uiviewcontroller โดยไม่ขึ้นกับชื่อรายการแถบแถบ
ฉันกำลังตั้งชื่อตัวควบคุมมุมมองของฉันเช่นนี้ในมุมมองได้โหลด: self.title = @"my title"; ก่อนหน้านี้ฉันตั้งชื่อเรื่องในกระดานเรื่องราวสำหรับตัวควบคุมมุมมองและตัวควบคุมการนำทางที่ฝังอยู่ฉันตั้งค่าเป็น: "ชื่อเรื่อง"; เมื่อฉันคลิกที่แท็บที่มีตัวควบคุมมุมมองชื่อของรายการแถบแท็บและuiviewcontrollerเปลี่ยนเป็น: ชื่อของฉัน ฉันต้องการให้ตัวควบคุมมุมมองเปลี่ยน แต่รายการแถบแท็บจะยังคงอยู่กับชื่อ: ชื่อเรื่อง ฉันจะทำสิ่งนี้ให้สำเร็จได้อย่างไร?

16
วิธีล็อคการวางแนวของคอนโทรลเลอร์มุมมองเดียวเป็นโหมดแนวตั้งเฉพาะใน Swift
เนื่องจากแอปของฉันรองรับการวางแนวทั้งหมด ฉันต้องการล็อคเฉพาะโหมดแนวตั้งเฉพาะ UIViewController เช่นสมมติว่าเป็นแอปพลิเคชันแบบแท็บและเมื่อมุมมองการลงชื่อเข้าใช้ปรากฏขึ้นแบบโมฆะฉันเพียงต้องการให้มุมมองลงชื่อเข้าใช้เป็นโหมดแนวตั้งเท่านั้นไม่ว่าผู้ใช้จะหมุนอุปกรณ์อย่างไรหรือการวางแนวอุปกรณ์ปัจจุบันจะเป็นอย่างไร

3
addChildViewController ทำอะไรได้จริง?
ฉันเพิ่งจุ่มเท้าของฉันเป็นครั้งแรกในการพัฒนา iOS และหนึ่งในสิ่งแรกที่ฉันต้องทำคือใช้ตัวควบคุมมุมมองคอนเทนเนอร์แบบกำหนดเอง - เรียกได้SideBarViewControllerว่าเปลี่ยนจากตัวควบคุมมุมมองเด็กที่เป็นไปได้หลายตัว แสดงเกือบจะเหมือนกับTab Bar Controllerมาตรฐาน (มันค่อนข้างเป็นTab Bar Controllerแต่มีเมนูด้านข้างที่ซ่อนได้แทนที่จะเป็นแถบแท็บ) ตามคำแนะนำในเอกสารของ Apple ฉันโทรหาaddChildViewControllerทุกครั้งที่ฉันเพิ่ม ViewController ลูกลงในคอนเทนเนอร์ของฉัน รหัสของฉันสำหรับการสลับตัวควบคุมมุมมองเด็กปัจจุบันที่แสดงโดยSideBarViewControllerมีลักษณะดังนี้: - (void)showViewController:(UIViewController *)newViewController { UIViewController* oldViewController = [self.childViewControllers objectAtIndex:0]; [oldViewController removeFromParentViewController]; [oldViewController.view removeFromSuperview]; newViewController.view.frame = CGRectMake( 0, 0, self.view.frame.size.width, self.view.frame.size.height ); [self addChildViewController: newViewController]; [self.view addSubview: newViewController.view]; } จากนั้นฉันก็เริ่มพยายามหาว่าaddChildViewControllerที่นี่ทำอะไรและฉันก็รู้ว่าฉันไม่รู้ นอกจากการติดใหม่ViewControllerใน.childViewControllersอาร์เรย์แล้วดูเหมือนว่าจะไม่มีผลกระทบใด ๆ การดำเนินการและช่องทางจากมุมมองของผู้ควบคุมเด็กไปยังตัวควบคุมเด็กที่ฉันตั้งไว้บนกระดานเรื่องราวยังคงทำงานได้ดีแม้ว่าฉันจะไม่เคยโทรเลยaddChildViewControllerก็ตามและฉันนึกไม่ออกว่าจะมีผลกระทบอะไรอีก อันที่จริงถ้าฉันเขียนรหัสของฉันใหม่เพื่อไม่เรียกaddChildViewControllerและมีลักษณะเช่นนี้แทน …

12
presentViewController และการแสดงแถบนำทาง
ฉันมีลำดับชั้นของตัวควบคุมมุมมองและตัวควบคุมด้านบนสุดจะแสดงเป็นโมดอลและต้องการทราบวิธีแสดงแถบนำทางเมื่อใช้ 'UIViewController:presentViewController:viewControllerToPresent:animated:completion' เอกสารสำหรับ 'presentViewController: animated: complete:' note: 'บน iPhone และ iPod touch มุมมองที่นำเสนอจะเป็นแบบเต็มหน้าจอเสมอ บน iPad งานนำเสนอจะขึ้นอยู่กับค่าในคุณสมบัติ modalPresentationStyle ' สำหรับ 'modalPresentationStyle' เอกสารจะกล่าวว่า: รูปแบบการนำเสนอเป็นตัวกำหนดว่าจะแสดงตัวควบคุมมุมมองที่นำเสนอแบบโมดูลาร์อย่างไรบนหน้าจอ บน iPhone และ iPod touch ตัวควบคุมมุมมองแบบโมดอลจะแสดงแบบเต็มหน้าจอเสมอ แต่บน iPad มีตัวเลือกการนำเสนอที่แตกต่างกันมากมาย มีวิธีใดบ้างที่จะทำให้แน่ใจว่าแถบนำทางสามารถมองเห็นได้ด้านล่างแถบสถานะเมื่อตัวควบคุมมุมมองแสดงขึ้นเอง ฉันควรตีความเอกสารว่าคุณไม่ได้รับตัวเลือกใด ๆ ของ iPhone / iPod และเฉพาะบน iPad ก่อนหน้านี้ฉันใช้'UIViewController:presentModalViewController:animated'ซึ่งใช้งานได้ดี แต่ตั้งแต่ iOS 5.0 เป็นต้นมา API ได้เลิกใช้งานแล้วฉันจึงเปลี่ยนไปใช้อันใหม่ มองเห็นสิ่งที่ฉันต้องการทำคือให้ตัวควบคุมใหม่เลื่อนเข้ามาจากด้านล่างของหน้าจอเช่นเดียวกับ API เก่าที่เคยทำ …


5
มุมมองที่รั่วไหลเมื่อเปลี่ยน rootViewController ภายใน TransitionWithView
ในขณะที่ตรวจสอบการรั่วไหลของหน่วยความจำฉันพบปัญหาที่เกี่ยวข้องกับเทคนิคการโทรsetRootViewController:ภายในบล็อกภาพเคลื่อนไหวการเปลี่ยนแปลง: [UIView transitionWithView:self.window duration:0.5 options:UIViewAnimationOptionTransitionFlipFromLeft animations:^{ self.window.rootViewController = newController; } completion:nil]; หากตัวควบคุมมุมมองเก่า (ตัวที่ถูกแทนที่) กำลังนำเสนอตัวควบคุมมุมมองอื่นอยู่รหัสด้านบนจะไม่ลบมุมมองที่นำเสนอออกจากลำดับชั้นของมุมมอง นั่นคือลำดับของการดำเนินการนี้ ... X กลายเป็น Root View Controller X นำเสนอ Y เพื่อให้มุมมองของ Y ปรากฏบนหน้าจอ ใช้transitionWithView:เพื่อทำให้ Z เป็น Root View Controller ใหม่ ... ดูเหมือนผู้ใช้จะตกลง แต่เครื่องมือลำดับชั้นของมุมมองดีบักจะเปิดเผยว่ามุมมองของ Y ยังคงมีอยู่เบื้องหลังมุมมองของ Z ภายใน a UITransitionView. นั่นคือหลังจากสามขั้นตอนข้างต้นลำดับชั้นของมุมมองคือ: UIWindow UITransitionView UIView (มุมมองของ Y) UIView …

14
การลบวิวคอนโทรลเลอร์ออกจากสแต็กการนำทาง
ฉันมีสแต็กการนำทางพร้อมด้วย UIViewControllers 5 ตัว ฉันต้องการลบตัวควบคุมวิวตัวที่ 3 และ 4 ในสแต็กเมื่อคลิกปุ่มในตัวควบคุมวิวตัวที่ 5 เป็นไปได้ไหมที่จะทำเช่นนี้? ถ้าเป็นอย่างไร

7
ตัวอย่างตัวควบคุมมุมมองคอนเทนเนอร์ [ปิด]
ปิด. คำถามนี้ไม่เป็นไปตามหลักเกณฑ์กองมากเกิน ขณะนี้ยังไม่ยอมรับคำตอบ ต้องการปรับปรุงคำถามนี้หรือไม่ อัปเดตคำถามเพื่อให้เป็นหัวข้อสำหรับ Stack Overflow ปิดให้บริการใน4 ปีที่แล้ว ปรับปรุงคำถามนี้ ใครช่วยชี้ตัวอย่างดีๆในการสร้าง Custom View Controller เป็น Container View Controller ได้บ้าง เอกสารเดียวที่ฉันสามารถพบคือคู่ของย่อหน้าที่UIViewController ชั้นอ้างอิง ฉันรู้สึกว่าฉันต้องการข้อมูลมากกว่านั้นเล็กน้อยและตัวอย่างการนำไปใช้ก็จะดี Google ไม่ได้ทำอะไรเลย ฉันสนใจวิธีนี้เป็นพิเศษ: transitionFromViewController:toViewController:duration:options:animations:completion:

5
ฉันจะสร้าง initializer แบบกำหนดเองสำหรับคลาสย่อย UIViewController ใน Swift ได้อย่างไร
ขออภัยหากมีการถามก่อนหน้านี้ฉันได้ค้นหาหลายรอบและคำตอบมากมายมาจาก Swift betas ก่อนหน้านี้เมื่อสิ่งต่างๆแตกต่างออกไป ดูเหมือนจะหาคำตอบที่ชัดเจนไม่ได้ ฉันต้องการคลาสย่อยUIViewControllerและมีตัวเริ่มต้นที่กำหนดเองเพื่อให้ฉันตั้งค่าในโค้ดได้อย่างง่ายดาย ฉันประสบปัญหาในการทำสิ่งนี้ใน Swift ฉันต้องการinit()ฟังก์ชั่นที่ฉันสามารถใช้เพื่อส่งผ่านเฉพาะที่NSURLฉันจะใช้กับตัวควบคุมมุมมอง init(withImageURL: NSURL)ในใจของฉันมันมีลักษณะคล้าย ถ้าฉันเพิ่มฟังก์ชันนั้นจะขอให้ฉันเพิ่มinit(coder: NSCoder)ฟังก์ชันนั้น ฉันเชื่อว่าเป็นเพราะมันถูกทำเครื่องหมายในซูเปอร์คลาสด้วยrequiredคีย์เวิร์ด? ดังนั้นฉันต้องทำใน subclass? ฉันเพิ่มมัน: required init(coder aDecoder: NSCoder) { super.init(coder: aDecoder) } ตอนนี้เป็นอย่างไร เริ่มต้นพิเศษของฉันถือเป็นconvenienceหนึ่งหรือไม่? หนึ่งที่กำหนด? ฉันเรียก super initializer หรือไม่? initializer จากคลาสเดียวกัน? ฉันจะเพิ่มโปรแกรมเริ่มต้นพิเศษของฉันลงในUIViewControllerคลาสย่อยได้อย่างไร

8
presentViewController: ภาพเคลื่อนไหว: มุมมองใช่จะไม่ปรากฏจนกว่าผู้ใช้จะแตะอีกครั้ง
presentViewController:animated:completionฉันได้รับบางพฤติกรรมแปลกกับ สิ่งที่ฉันกำลังทำคือเกมทายใจ ฉันมีUIViewController(frequencyViewController) ที่มีUITableView(frequencyTableView) เมื่อผู้ใช้แตะที่แถวที่มีปัญหา TableView ที่มีคำตอบที่ถูกต้องมุมมอง (correctViewController) ควรเป็นอินสแตนซ์และมุมมองควรเลื่อนขึ้นจากด้านล่างของหน้าจอเป็นมุมมองแบบโมดอล สิ่งนี้จะบอกผู้ใช้ว่าพวกเขามีคำตอบที่ถูกต้องและรีเซ็ต frequencyViewController ข้างหลังพร้อมสำหรับคำถามต่อไป correctViewController ถูกปิดเมื่อกดปุ่มเพื่อเปิดเผยคำถามถัดไป ทั้งหมดนี้ทำงานอย่างถูกต้องทุกครั้งและมุมมองของ correctViewController ปรากฏขึ้นทันทีตราบใดที่มีpresentViewController:animated:completionanimated:NO หากฉันตั้งanimated:YES, correctViewController viewDidLoadจะเริ่มต้นและทำให้การโทรไปยัง อย่างไรก็ตามviewWillAppear, viewDidAppearและบล็อกเสร็จสิ้นจากการpresentViewController:animated:completionไม่ได้เรียกว่า แอปเพิ่งตั้งอยู่ที่นั่นโดยยังคงแสดง frequencyViewController จนกว่าฉันจะแตะครั้งที่สอง ตอนนี้ viewWillAppear, viewDidAppear และบล็อกเสร็จสมบูรณ์ถูกเรียก ฉันตรวจสอบอีกเล็กน้อยและไม่ใช่แค่การแตะอีกครั้งที่จะทำให้มันดำเนินต่อไป ดูเหมือนว่าถ้าฉันเอียงหรือเขย่า iPhone ของฉันสิ่งนี้อาจทำให้เกิดการเรียกใช้ viewWillLoad เป็นต้นเหมือนกับว่ามันกำลังรอให้ผู้ใช้ป้อนข้อมูลอื่น ๆ ก่อนที่มันจะดำเนิน สิ่งนี้เกิดขึ้นบน iPhone จริงและในเครื่องจำลองซึ่งฉันพิสูจน์แล้วโดยส่งคำสั่งเขย่าไปยังเครื่องจำลอง ฉันรู้สึกสูญเสียจริงๆกับสิ่งที่ต้องทำเกี่ยวกับเรื่องนี้ ... ฉันขอขอบคุณสำหรับความช่วยเหลือที่ทุกคนสามารถให้ได้ ขอบคุณ นี่คือรหัสของฉัน ค่อนข้างเรียบง่าย ... นี่คือโค้ดใน questionViewController ที่ทำหน้าที่เป็นผู้รับมอบสิทธิ์ให้กับ …

3
iOS Nested View Controllers ดูภายในมุมมองของ UIViewController หรือไม่
โดยทั่วไปแล้วการเขียนโปรแกรมที่ไม่ดีใน iOS จะมีมุมมองของตัวควบคุมมุมมองที่ซ้อนกันอยู่ในมุมมองของ UIViewController หรือไม่? ตัวอย่างเช่นฉันต้องการมีองค์ประกอบโต้ตอบบางอย่างที่ตอบสนองต่อการสัมผัสของผู้ใช้ แต่ใช้เวลาเพียง 25% ของหน้าจอ ฉันคิดว่าฉันจะเพิ่มตัวควบคุมมุมมองที่ซ้อนกันนี้ไปยัง UIViewController ของฉันโดยพูดว่า: [self.view addSubview: nestedViewController.view];

21
Popover ที่มีตัวควบคุมการนำทางในตัวไม่เคารพขนาดของการนำทางย้อนกลับ
ฉันมี UIPopoverController ที่โฮสต์ UINavigationController ซึ่งมีลำดับชั้นเล็ก ๆ ของตัวควบคุมมุมมอง ฉันติดตามเอกสารและสำหรับตัวควบคุมมุมมองแต่ละตัวฉันตั้งค่าขนาดบริบทป๊อปโอเวอร์ของมุมมองดังนี้: [self setContentSizeForViewInPopover:CGSizeMake(320, 500)]; (ขนาดแตกต่างกันสำหรับแต่ละคอนโทรลเลอร์) สิ่งนี้ทำงานได้ตามที่คาดไว้เมื่อฉันเลื่อนไปข้างหน้าในลำดับชั้น - ป๊อปโอเวอร์จะเคลื่อนไหวการเปลี่ยนแปลงขนาดโดยอัตโนมัติเพื่อให้สอดคล้องกับตัวควบคุมแบบพุช อย่างไรก็ตามเมื่อฉันนำทาง "ย้อนกลับ" ผ่านสแต็กมุมมองผ่านปุ่มย้อนกลับของแถบนำทางป๊อปโอเวอร์จะไม่เปลี่ยนขนาด แต่จะยังคงมีขนาดใหญ่เท่ากับมุมมองที่ลึกที่สุด สิ่งนี้ดูเหมือนจะพังทลายสำหรับฉัน ฉันคาดหวังให้ป๊อปโอเวอร์เป็นไปตามขนาดที่ตั้งค่าเมื่อปรากฏผ่านสแต็กมุมมอง ฉันพลาดอะไรไปรึเปล่า? ขอบคุณ.

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.