Adaptive segue ใน storyboard Xcode 6. Push เลิกใช้แล้วหรือไม่?


121

ตัวสร้างอินเทอร์เฟซ Xcode 6 โดยค่าเริ่มต้นจะมีช่องทำเครื่องหมายใหม่ "ใช้คลาสขนาด" ทำให้มุมมองปรับตัวได้ ใส่คำอธิบายภาพที่นี่

เมื่อฉันพยายามทำต่อเนื่องระหว่าง 2 มุมมองในสตอรีบอร์ดของฉันฉันมีตัวเลือกใหม่: ใส่คำอธิบายภาพที่นี่

แทนเก่า:

ใส่คำอธิบายภาพที่นี่

ตอนนี้เรามี "show" และ "present modally" แทน "push" และ "modal" ตัวเลือกเก่าถูกทำเครื่องหมายว่าเลิกใช้งานแล้ว ฉันได้เลือกตัวเลือก "แสดง" เพราะในการตั้งค่าการทำต่อเรียกว่า "แสดง (เช่นพุช)

ใส่คำอธิบายภาพที่นี่

แต่มันไม่ได้ผลักดัน ภาพเคลื่อนไหว Segue ดูเหมือนว่าสไลด์จากด้านล่าง (โมดอล) และแถบนำทางจะหายไป

คำถามคือฉันจะทำให้งาน "แสดง" เป็นแบบพุชได้อย่างไร? เป็นไปได้หรือฉันควรใช้ "push (deprecated)" แทน ฉันจะหาข้อมูลเกี่ยวกับการทำต่อแบบใหม่ได้ที่ไหน? สิ่งเดียวที่ฉันพบในไลบรารีนักพัฒนา iOS8 คือStoryboards ช่วยคุณออกแบบส่วนต่อประสานผู้ใช้ของคุณแต่ไม่มีข้อมูลเกี่ยวกับการ "แสดง"

UPDATE

ฉันพยายามสร้างโปรเจ็กต์ใหม่และ "การแสดง" ก็ใช้งานได้จริงเหมือน "ดัน" ฉันคิดว่าปัญหาในโครงการของฉันอาจเป็นเพราะฉันใช้ตัวควบคุมการนำทางซ้ำกับรหัสเช่นนี้ แต่ฉันไม่รู้วิธีแก้ไข

if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
    SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;
    
    swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
        
        UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
        [navController setViewControllers: @[dvc] animated: NO ];
        [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
    };
    
}

หลังจากนั้นฉันลองกด NewViewController หลังจาก MainViewController ใส่คำอธิบายภาพที่นี่

อัปเดต 2:

ดูเหมือนว่าจะเป็นเฉพาะปัญหา iOS 7, iOS 7.1

คำตอบ:


97

ใช่ใช้ "Show" แทน "Push"

ฉันจะทำให้งาน "แสดง" เป็นแบบพุชได้อย่างไร? เป็นไปได้หรือควรใช้ "push (depricated)" แทน

มันควรจะ; มันทำเพื่อฉัน ฉันใช้ Xcode 6 beta 2 และเพื่อทดสอบฉันใช้เทมเพลตมุมมองเดียว (เรียกใช้ตัวควบคุมมุมมองที่สร้างไว้ล่วงหน้าใน IB 'VC_A') จากนั้นฉันก็เพิ่มตัวควบคุมมุมมองอื่น ('VC_B') จากนั้นฉันเพิ่มปุ่มบน VC_A เพื่อแสดง VC_B และอีกปุ่มหนึ่งจาก VC_B กลับไปที่ VC_A เมื่อฉันเพิ่มตัวควบคุมการนำทางเป็นตัวควบคุมมุมมองเริ่มต้นในสตอรี่บอร์ดและทำให้ VC_A เป็น rootViewController ทั้ง 'push' และ 'show' จะมีผลเหมือนกัน หากฉันไม่มีตัวควบคุมการนำทางเริ่มต้นและฉันใช้ 'แสดง' ฉันจะได้รับสิ่งที่คุณอธิบายไว้ในนั้น VC_B จะเลื่อนขึ้นจากด้านล่าง ถ้าฉันพยายามที่จะ 'ผลัก' ฉันจะเกิดความผิดพลาดเนื่องจากในการที่จะทำการพุชฉันต้องมีตัวควบคุมการนำทาง

ฉันจะหาข้อมูลเกี่ยวกับการต่อแบบใหม่ได้ที่ไหน?

ดังนั้นผมจึงพบข้อมูลบางอย่างใน 'มีอะไรใหม่ใน Interface Builder' เซสชั่นที่นี่ หากคุณดูสไลด์คุณจะเห็นหนึ่งสไลด์ (41) กล่าวถึงการเปลี่ยนแปลง เมื่อดูวิดีโอเซสชันนั้นคุณสามารถข้ามไปที่นาที 38:00 ที่พวกเขาเริ่มพูดคุยเกี่ยวกับฉากที่ปรับเปลี่ยนได้ พวกเขาอธิบายว่าตัวอย่างเช่นการทำต่อแบบปรับ 'แสดง' จะคำนึงถึงบริบทในการตัดสินใจว่าจะนำเสนอตัวควบคุมมุมมองใหม่อย่างไร


ขอบคุณสำหรับคำตอบ. ฉันพยายามสร้างโปรเจ็กต์ใหม่และ "แสดง" ก็ใช้งานได้จริงเหมือนการกดด้วยตัวควบคุมการนำทาง ในโครงการของฉันฉันมีโครงสร้างที่ซับซ้อนด้วยแถบด้านข้างจากบทเรียนนี้appcoda.com/ios-programming-sidebar-navigation-menuและผลักดันผลงานแสดงไม่ได้ อาจเป็นสาเหตุที่ฉันใช้ตัวควบคุมการนำทางซ้ำ ฉันได้อัปเดตคำถามของฉันด้วยรหัสใช้ซ้ำ
John Kakon

ดังนั้นสิ่งแรกที่ฉันเห็นเมื่อดูการอัปเดตของคุณคือคุณกำลังใช้การคาดหวังที่กำหนดเอง: 'SWRevealViewControllerSegue' ดังนั้นอาจไม่สมเหตุสมผลที่จะใช้ 'show' หรือ 'push' ในกรณีของคุณเนื่องจากมีการสร้างขึ้น Segues ในขณะที่คุณต้องการเรียกใช้โค้ดที่กำหนดเองของคุณเอง เมื่อฉันดาวน์โหลดโปรเจ็กต์ตัวอย่างมันจะแสดงให้เห็นถึงการเลือก 'กำหนดเอง' ในส่วนต่างๆในไฟล์สตอรี่บอร์ด
Spencer Hall

ฉันไม่ได้หมายถึงเรื่องนี้ ฉันกำลังพูดถึงการสร้าง UIViewController ใหม่ถัดจาก "MainViewController" (มีตัวควบคุมการนำทางและ "การอัปเดต" ของฉันแสดงให้เห็นว่าฉันจะไปที่นั่นได้อย่างไร) และพยายามที่จะพุช View ใหม่ไปยัง MainViewController ภาพหน้าจอสตอรี่บอร์ดฉันจะขอบคุณถ้าคุณเปิดใช้ "ใช้คลาสขนาด" ในโปรเจ็กต์ตัวอย่างสร้าง NewViewController และลองทำต่อระหว่าง MainViewController และ NewViewController โดย "show" คุณจะเห็นว่าฉันกำลังพูดถึงอะไร
John Kakon

นั่นเป็นเพียงตอนนี้และอย่างน้อยสำหรับฉัน "แสดง" ดำเนินการเช่นเดียวกับ "ดัน"
Spencer Hall

9
คุณสามารถแก้ไขข้อบกพร่องได้โดยตรวจสอบให้แน่ใจว่าทุกวิธีในตัวควบคุมมุมมองของคุณมี UINavigationController ที่รูท แม้ว่านั่นจะหมายถึงการใส่ UINavigationController ลงในสตอรีบอร์ดของคุณซึ่งจะไม่มีวันเข้าถึงได้ ดูเหมือนว่าการเดินสายจะใช้ในการอนุมานพฤติกรรม
Scott Robertson

33

มีคำตอบที่ยอมรับอยู่แล้ว แต่ฉันต้องการให้ข้อมูลเพิ่มเติมเล็กน้อยอาจเป็นข้อมูลที่ไม่มีมาก่อน

ดังที่ได้กล่าวไว้ก่อนหน้านี้การทำเซ็กส์แบบ "push" และ "modal" ถูกเลิกใช้งานและถูกแทนที่ด้วย "show" และ "present modally" ตามลำดับ ตามเอกสารของ Apple Segues ใหม่ได้ถูกแบ่งออกเป็นเซ็กส์ที่ปรับให้เข้ากับคลาสขนาด รุ่นเก่าควรใช้เพื่อรองรับ iOS เวอร์ชันเก่ากว่า iOS 8 เท่านั้น

เอกสารในลิงค์ต่อไปนี้จะอธิบายและคำอธิบายของเซกส์ที่มีอยู่ทั้งหมดทั้งเก่าและใหม่

การเพิ่ม Segue ระหว่างฉากใน Storyboard

ในกรณีที่ URL มีการเปลี่ยนแปลงในอนาคตนี่คือคำอธิบายที่ให้ไว้สำหรับการต่อใหม่แต่ละครั้ง:

แสดง

นำเสนอเนื้อหาในรายละเอียดหรือพื้นที่ต้นแบบขึ้นอยู่กับเนื้อหาของหน้าจอ หากแอปกำลังแสดงมุมมองหลักและมุมมองรายละเอียดเนื้อหาจะถูกผลักไปยังพื้นที่รายละเอียด หากแอปแสดงเฉพาะต้นแบบหรือรายละเอียดเนื้อหาจะถูกผลักไปที่ด้านบนของสแต็กคอนโทรลเลอร์มุมมองปัจจุบัน

แสดงรายละเอียด

นำเสนอเนื้อหาในพื้นที่รายละเอียด หากแอปกำลังแสดงมุมมองหลักและมุมมองรายละเอียดเนื้อหาใหม่จะแทนที่รายละเอียดปัจจุบัน หากแอปแสดงเฉพาะต้นแบบหรือรายละเอียดเนื้อหาจะแทนที่ส่วนบนของสแต็กคอนโทรลเลอร์มุมมองปัจจุบัน

นำเสนอ Modally

นำเสนอเนื้อหาแบบพอประมาณ มีตัวเลือกให้เลือกรูปแบบการนำเสนอ (UIModalPresentationStyle) และสไตล์การเปลี่ยนผ่าน (UIModalTransitionStyle)

นำเสนอเป็น Popover

นำเสนอเนื้อหาแบบป็อปโอเวอร์ที่ยึดกับมุมมองที่มีอยู่ มีตัวเลือกในการระบุทิศทางที่เป็นไปได้ของลูกศรที่แสดงบนขอบด้านหนึ่งของมุมมองป็อปโอเวอร์ (UIPopoverArrowDirection) นอกจากนี้ยังมีตัวเลือกในการระบุมุมมองจุดยึด


24

TLDR; ลบ Segue ที่ผลักดันไม่ถูกต้องและสร้างขึ้นใหม่ในสตอรีบอร์ดโดยลากจาก UIView / UIControl ไปยังตัวควบคุมมุมมองเป้าหมาย

คำตอบอื่น ๆ ไม่มีอะไรผิด แต่คำตอบนี้อธิบายถึงสิ่งที่เกิดขึ้นคุณจะตรวจสอบได้อย่างไรว่ากำลังเกิดขึ้นและจะแก้ไขปัญหาในอนาคตได้อย่างไร

พื้นหลัง

ในกรณีของฉัน Show Segues ของฉันไม่ทำงานแม้ว่าฉันจะมี UINavigationController เป็นตัวควบคุมมุมมองเริ่มต้นของฉันอยู่แล้ว (โดยมี UIViewController เนื้อหาเป็นรูท)

ทำไมและวิธีการแสดง Segue Breaks

การแสดงการทำต่อจะหยุดลงเมื่อมีการดำเนินการที่เกี่ยวข้องกับการทำต่อภายใน xml ซอร์สของกระดานเรื่องราว สถานการณ์ทั่วไปที่ก่อให้เกิดสิ่งนี้อาจเป็นได้หากคุณได้กำหนดการทำต่อใหม่จากการทำต่อด้วยตนเองที่เรียกในโค้ดก่อนหน้านี้ ซึ่งจะทำให้บิตต่อไปนี้อยู่ใน xml สตอรี่บอร์ด

<connections>
    <segue destination="85t-Z1-hxf" kind="show" identifier="ToOptions" action="showDetailViewController:sender:" id="gdZ-IX-KcN">
</connections>

Nota Bene เพื่อดูสตอรี่บอร์ดเป็น xml; คลิกขวาที่ไฟล์สตอรี่บอร์ดและเลือกเปิดเป็น> รหัสที่มา ในการเปลี่ยนกลับให้ใช้ Open as> Interface Builder - Storyboard

เพื่อรองรับการดำเนินการแบบกำหนดเองใด ๆ เมื่อใช้การต่อจากสตอรีบอร์ดคุณสามารถแตะที่เตรียมฟอร์เซกคิวและสกัดกั้นตัวควบคุมมุมมองปลายทางและเรียกใช้วิธีการใด ๆ จากตำแหน่งนั้น ไม่ว่าในกรณีใดผลข้างเคียงของข้อผิดพลาดเล็ก ๆ น้อย ๆ นี้ (ข้อบกพร่องคือความจริงที่ว่าเมื่อคุณกำหนดการทำต่อใหม่มันไม่ได้ตั้งค่าอย่างถูกต้องใน xml ~ นั่นคือการดำเนินการจะยังคงอยู่แม้ว่าคุณจะเปลี่ยนการต่อเป็นสิ่งที่ทำงานจาก UIView (หรือ UIControl) ไปยังตัวควบคุมมุมมองเป้าหมาย)

น่าเสียดายที่โซลูชันที่ตรงที่สุดล้มเหลว ดังนั้นการลบแอตทริบิวต์ xml สำหรับการดำเนินการจากภายใน Storyboard จะไม่สามารถแก้ไขปัญหาได้ แต่เราต้องลบและสร้างการต่อเนื่องในสตอรี่บอร์ด

เมื่อสร้าง storyboard xml ขึ้นใหม่จะไม่มีการดำเนินการที่เชื่อมโยงกับการต่อโดยเฉพาะอีกต่อไปและการแสดงจะดำเนินการแบบ Push

ตัวอย่าง Xml สำหรับแสดง Segue ที่ถูกต้อง

  <connections>
    <segue destination="RbV-Au-WV9" kind="show" identifier="ToOptions" id="5dm-os-bcS"/>
  </connections>

การบรรเทา

ในการป้องกันการเกิดซ้ำเราจำเป็นต้องยึดติดกับสตอรี่บอร์ดที่ไม่ใช่การทำด้วยตนเองหากเป็นไปได้โดยใช้การเตรียมการเพื่อเพิ่มการดำเนินการที่จำเป็นตามตัวควบคุมมุมมองปลายทาง หรือหากคุณต้องผสมและจับคู่ให้ใช้ความระมัดระวังเพื่อตรวจสอบว่า Show segues ของคุณไม่มีการดำเนินการใด ๆ ที่แนบมาใน xml สตอรี่บอร์ด หากคุณกำลังจัดการกับโครงการที่เก่ากว่าคุณควรให้ความสนใจเป็นพิเศษกับซอร์สโค้ด Storyboard เนื่องจากฉันได้ค้นพบปัญหาบางประการ


3
หลังจากผ่านไปหลายชั่วโมงสิ่งนี้อาจช่วยฉันได้อีกหลายชั่วโมง นี่คือสิ่งที่ฉันจะแนะนำตามข้างต้น: เปิดสตอรีบอร์ดเป็นซอร์สโค้ดค้นหาชนิด = "แสดง"และดูว่าบรรทัดมีสิ่งที่ต้องการaction = "showDetailViewController: sender:"หรือไม่หากเป็นเช่นนั้นให้ลบทุกอย่างออกจากการกระทำ =จนกว่าจะปิด"ฉันมีสตอรี่บอร์ดขนาดใหญ่จริงและ seque ที่ได้รับผลกระทบไม่มีพารามิเตอร์การดำเนินการนี้ แต่มีบรรทัดอื่นที่ไม่เกี่ยวข้องเมื่อฉันลบการกระทำซีเควสที่ปรับเปลี่ยนทั้งหมดจะทำงานอีกครั้งตามที่คาดไว้เพียงแค่ลบ seque ที่ได้รับผลกระทบไม่ได้ ' t ทำงาน
Marcus

สิ่งนี้ช่วยฉันได้เช่นกัน
Adam Bardon

1
การลบแอ็ตทริบิวต์การดำเนินการใน XML ใช้ได้ผลกับเพื่อนของฉัน
Brent Royal-Gordon

ช่วยฉันด้วย
Jimmy George Thomas

ลบแอ็ตทริบิวต์การดำเนินการในไฟล์ xml และ voila ก็ใช้ได้ จะไม่พบปัญหาหากไม่มีโพสต์นี้
krizzzn

20

ดังที่Scott Robertson แสดงความคิดเห็นไว้ที่นี่ดูเหมือนว่าจะมีข้อบกพร่องใน iOS 7

ดูเหมือนว่าใน iOS 8 จะมีการอนุมานการเปลี่ยนแปลงที่รันไทม์ (พฤติกรรมที่ถูกต้อง) ในขณะที่ใน iOS 7 การเปลี่ยนแปลงจะถูกอนุมาน ณ เวลาออกแบบ (พฤติกรรมของบั๊กกี้)

วิธีแก้ปัญหาที่ง่ายที่สุดคือการเพิ่มตัวควบคุมการนำทางที่ไม่ได้ใช้ลงในกระดานเรื่องราวและเชื่อมโยงขึ้นเพื่อให้ตัวควบคุมมุมมองที่เป็นปัญหาเป็นส่วนหนึ่งของตัวควบคุมการนำทางนี้ คุณไม่จำเป็นต้องสร้างอินสแตนซ์ตัวควบคุมการนำทางคุณเพียงแค่ต้องใช้ตัวควบคุมมุมมองบั๊กกี้เพื่อให้รู้ว่ามันถูกฝังอยู่ในตัวควบคุมการนำทาง

หมายเหตุ: การจำลองแถบนำทางไม่เพียงพอสำหรับวัตถุประสงค์เหล่านี้ จริงๆแล้วคุณต้องมีตัวควบคุมการนำทางใน push stack

ในการสร้างจุดบกพร่อง:

  1. สร้างสตอรีบอร์ดใหม่ที่ใช้คลาสขนาด
  2. สร้างตัวควบคุมสองมุมมอง (ไม่มีตัวควบคุมการนำทาง)
  3. ทำให้ตัวควบคุมมุมมองแรกแสดงตัวควบคุมมุมมองที่สองผ่านการแสดง (เช่น Push) ที่เชื่อมโยงกับปุ่มตัวอย่างเช่น
  4. ในโค้ดแสดงตัวควบคุมมุมมองแรก แต่ฝังไว้ในตัวควบคุมการนำทางผ่านinitWithRootViewController:วิธีการ
  5. เรียกใช้แอปบน iOS 7
  6. แตะปุ่มที่ควรทำการกด
  7. คุณจะได้รับการเปลี่ยนเป็นกิริยาแทนการกดบน iOS 7 บน iOS 8 คุณจะได้รับพฤติกรรมการผลักที่ถูกต้อง

ใส่คำอธิบายภาพที่นี่

ในการแก้ไขข้อบกพร่อง:

  1. เพิ่มตัวควบคุมการนำทางไปยังสตอรีบอร์ดและตั้งค่าตัวควบคุมมุมมองแรกเป็นตัวควบคุมมุมมองรูท (หมายเหตุ: การเพิ่มตัวที่สองเนื่องจากตัวควบคุมมุมมองรูทจะไม่แก้ไขข้อบกพร่องนี้)
  2. ระบุตัวระบุขยะเพื่อระงับคำเตือนเกี่ยวกับตัวควบคุมการนำทางที่ไม่สามารถเข้าถึงได้และเพื่อบันทึกให้ตัวคุณเองทราบว่ามีอยู่เพื่อเป็นวิธีแก้ปัญหาเท่านั้น (เช่นworkaround for show segues in iOS 7).

ใส่คำอธิบายภาพที่นี่

สังเกตว่ามีการเพิ่มตัวควบคุมการนำทางในภาพที่สองอย่างไรและไม่มีลูกศรเข้ามาอย่างไร (กล่าวคือไม่มีวิธีใดที่จะสร้างอินสแตนซ์ได้นอกจากการใช้ตัวระบุตัวควบคุมมุมมอง)


1
ขอบคุณเคล็ดลับกับ NavigationController ทำเพื่อฉันเมื่อฉันสลับรูท NavigationControllers ViewController-Stack
Peter Pint

1
ทางออกที่ดีที่สุด ขอบคุณ
ИльяГолованов

13

ฉันรู้ว่าฉันมาสาย แต่อยากแบ่งปันสิ่งที่เรียนรู้ นี่เป็นข้อบกพร่องและยังคงมีอยู่ในปัจจุบัน (2014-12-18)

ผมเขียนบทความเกี่ยวกับเรื่องนี้ที่นี่

สามารถทำซ้ำได้ง่าย ใน iOS8 จะทำงานได้ดีและแม้กระทั่งใน iOS7.x ตราบใดที่คุณไม่ได้ผลักดันตัวควบคุมมุมมองโปรแกรมลงในสแตกก่อนที่จะเรียกShowทำต่อ

หากคุณดันไปที่สแต็กโดยใช้การเชื่อมต่อสตอรี่บอร์ดก็จะใช้ได้ แต่เห็นได้ชัดว่าถ้าคุณกดผ่านรหัสnavigationControllerคุณสมบัติของพุชUIViewControllerจะเป็นอย่างไรnilและเมื่อคุณเรียกShowมันจะถือว่าเป็นโมดอลเนื่องจากไม่มีการนำทางในการควบคุมสแต็ก

เพียง แต่วิธีแก้ปัญหาเพื่อให้ห่างไกลที่มีทั้งไม่ผลักดันรหัสผ่าน (ไม่เป็นไปได้) Pushหรือใช้เลิกใช้ในขณะนี้

ฉันยื่นเรดาร์ (ลิงก์ในบทความ) อย่าลังเลที่จะยื่นซ้ำโดยหวังว่า Apple จะแก้ไขปัญหานี้


3
นี่คือปัญหาของฉันขอบคุณ! การใช้การผลักดันที่เลิกใช้แล้วดูเหมือนจะเป็นทางออกที่ชั่วร้ายน้อยกว่าในกรณีนี้
Moshe Gottlieb

วิธีแก้ปัญหาอีกประการหนึ่งคือการเพิ่มตัวควบคุมการนำทาง (ที่ไม่ได้ใช้) ลงในกระดานเรื่องราว ดูstackoverflow.com/questions/24184003/…
Senseful

Nop! มันเกิดขึ้นที่นี่และสาเหตุไม่ใช่การผลักดันโดยโปรแกรม ในกรณีของฉันฉันดำเนินการShowต่อจากนั้นในการShowทำต่อครั้งที่สองจะมีการนำเสนอแบบแยกส่วนโซลูชัน?
Frade

@Frade คุณสามารถเชื่อมโยงไปยัง github repo ซึ่งสามารถทำซ้ำได้หรือไม่? คุณใช้ iOS เวอร์ชันใดอยู่
esttorhe

โปรเจ็กต์ส่วนตัว .. มันเกิดขึ้นเมื่อพยายามแสดง (วินาที) Showของ viewController บน iOS 7
Frade

2

ฉันมีปัญหาเดียวกันกับ segues ใน Xcode 7 และ iOS 7.1.2 แสดงการทำเซ็กส์ (ฟีเจอร์ใหม่จาก iOS 8) ทำงานเหมือนกับการทำเซ็กส์แบบโมดอลใน iOS 7และไม่อนุญาตให้คุณดัน View Controllers ของคุณเข้าไปในสแต็กของตัวควบคุมการนำทางเมื่อคุณกำหนดประเภทการต่อด้วย Xcode ใน Storyboard ของคุณ นั่นเป็นเหตุผลที่ self.navigationController ของคุณจะคืนค่าศูนย์เนื่องจาก View Controller ไม่ได้ถูกผลักไปที่สแต็กและคุณไม่สามารถเปิดได้

ฉันไม่เข้าใจว่าทำไม Apple ไม่เพิ่มการแจ้งเตือนใด ๆ สำหรับกรณีนี้ใน Xcode เมื่อคุณต้องการให้แอปของคุณทำงานบน iOS 7 พวกเขาบอกว่าเลิกใช้วิธีการพุช แต่ Show ทำงานไม่ถูกต้องกับ iOS 7

ฉันได้ทำอะไรเพื่อแก้ไขปัญหา:

ฉันได้สร้างคลาส MYShowSegue ด้วย. h

#import <UIKit/UIKit.h>

@interface MYShowSegue : UIStoryboardSegue

@end

และ. m ด้วยวิธีการดำเนินการเพียงวิธีเดียว:

#import "MYShowSegue.h"

@implementation MYShowSegue

- (void) perform {

    if ([[[self sourceViewController] navigationController] respondsToSelector:@selector(showViewController:sender:)]) {

        id sender = nil;
        [[[self sourceViewController] navigationController] showViewController:[self destinationViewController] sender:sender];
    }else{

        [[[self sourceViewController] navigationController] pushViewController:[self destinationViewController] animated:YES];
    }
}

@end

กว่าที่คุณจะต้องตั้งค่าประเภทกำหนดเองสำหรับแต่ละการทำต่อใน Storyboard ของคุณและเลือกคลาสใหม่สำหรับมันในกรณีของฉันมันคือ MYShowSegue

ตัวอย่าง Segue ที่กำหนดเอง

โซลูชันนี้จะช่วยให้คุณได้รับการสนับสนุนอย่างเต็มที่สำหรับแอป iOS 7 ของคุณพวกเขาจะใช้วิธีpushViewControllerเพื่อผลักดันมุมมองของคุณและสำหรับ iOS 8,9 เป็นต้นการทำต่อของคุณจะทำงานร่วมกับshowViewControllerวิธีใหม่ (iOS 8)

อย่าลืมทำเช่นเดียวกันกับ Segues ทั้งหมดของคุณใน Storyboard ของคุณ


ทางออกที่ดี - ใช้ได้ผลสำหรับฉัน (แทนที่จะเพิ่มตัวควบคุมการนำทางที่ "ไม่ได้ใช้" ...
Laurenz Glück

1

สิ่งนี้ยังคงเกิดขึ้นใน iOS 10.x

การลบและติดตั้ง Segues ใหม่ไม่ได้ช่วยแก้ปัญหาอะไรให้ฉัน:

ปัญหา: ฟังก์ชั่นที่ต้องการคือ 7 segues ซึ่งทำงานเป็น 'push' เท่านั้น (จริงๆแล้วคือรายละเอียดการแสดง) แต่ในความเป็นจริงมีเพียง segue แรกที่ฉันเพิ่มเท่านั้นที่จะผลักดันส่วนอื่น ๆ ทั้งหมดจะทำงานแบบโมฆะ แม้ว่าตัวสร้างอินเทอร์เฟซจะอธิบายถึงแต่ละส่วนที่เหมือนกัน

วิธีแก้ไข: ฉันต้องเพิ่มการกระทำลงใน 6 segues ที่ไม่มี

XML Storyboard ดั้งเดิม

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" id="3NK-93-wTy"/>
</connections>

ฉันเปลี่ยนสิ่งนี้โดยเพิ่ม showViewController: sender

<connections>
  <segue destination="tIr-4a-WfZ" kind="showDetail" identifier="A" action="showViewController:sender:" id="8yd-Ne-7KA"/>
  <segue destination="4mB-YE-5dM" kind="showDetail" identifier="B" action="showViewController:sender:" id="Uod-JC-786"/>
  <segue destination="Qh5-bJ-KcE" kind="showDetail" identifier="C" action="showViewController:sender:" id="3PW-nV-hWl"/>
  <segue destination="EI6-f4-QBB" kind="showDetail" identifier="D" action="showViewController:sender:" id="WUK-ju-KDm"/>
  <segue destination="nTz-N4-fpW" kind="showDetail" identifier="E" action="showViewController:sender:" id="Id6-bW-Huc"/>
  <segue destination="JEp-CH-6dW" kind="showDetail" identifier="F" action="showViewController:sender:" id="G0L-XW-7f4"/>
  <segue destination="AET-S1-O6h" kind="showDetail" identifier="G" action="showViewController:sender:" id="3NK-93-wTy"/>
</connections>
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.