ปรากฏภาพเคลื่อนไหวของ UIViewController ที่ถูกเรียกโดย pushViewController แสดงสองครั้ง

ฉันมี UISearchBar และฉันต้องการแสดง UIViewController อื่นเมื่อฉันคลิกปุ่มค้นหาจาก UISearchBar ฉันใช้วิธีการต่อไปนี้เพื่อสิ่งนั้น:

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main"
                                                         bundle:nil];
    UIViewController *add =
    [storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"];

    [self.navigationController pushViewController:add animated:YES];
}

ปัญหาคือภาพเคลื่อนไหวที่ปรากฏของ UIViewController ถูกเรียกสองครั้ง ฉันเห็นสไลด์ของคอนโทรลเลอร์เก่าสองเท่าจากด้านขวาไปซ้าย

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

วิธีการมอบหมายของ searchBarSearchButtonClicked ถูกเรียกเพียงครั้งเดียว

รหัสที่สร้างปัญหานั้นมีน้อยมาก ฉันอาจจะแนบโปรเจ็กต์ตัวอย่างในภายหลัง

แต่ UIVIewCOntroller พร้อมแถบค้นหามีลักษณะดังนี้:

- (void)viewDidLoad {
    [super viewDidLoad];

    UISearchBar *searchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 0, 100, 20)];
    searchBar.placeholder = NSLocalizedString(@"search a pub or a place", nil);
    searchBar.delegate = self;
    [self.navigationItem setTitleView:searchBar];

}

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    DLog(@"Filter searchBarSearchButtonClicked");
    UIStoryboard* storyboard = [UIStoryboard storyboardWithName:@"Main"
                                                         bundle:nil];
    UIViewController *add =
    [storyboard instantiateViewControllerWithIdentifier:@"mainMenuViewController"];

    [self.navigationController pushViewController:add animated:YES];
}

ปัญหาเกิดขึ้นทั้งบน iOS 8 และ 9

แก้ไข:

ฉันอัปโหลดโครงการตัวอย่างที่นี่ มันเรียบง่ายมาก

แก้ไข2:

หากฉันนำเสนอคอนโทรลเลอร์ในลักษณะนี้ ไม่ใช่ผ่านตัวควบคุมการนำทาง ภาพเคลื่อนไหวจะแสดงเพียงครั้งเดียว (แต่ก็เป็นแอนิเมชั่นอีกแบบหนึ่ง จากล่างขึ้นบน ก่อนหน้าคือจากขวาไปซ้าย) แต่ฉันต้องทำผ่านตัวควบคุมการนำทาง ดูเหมือนว่าปัญหาจะเกี่ยวข้องกับ UISearchBar Search คลิก + ตัวควบคุมการนำทาง

[self presentViewController:add
                   animated:YES
                 completion:nil];

แน่นอนฉันสามารถเรียกมันว่าไม่มีภาพเคลื่อนไหวเช่นนี้:

[self.navigationController pushViewController:add animated:NO];

แต่ถ้าฉันต้องการภาพเคลื่อนไหว

แก้ไข3:

ฉันพยายามแสดงคอนโทรลเลอร์ตัวที่สองผ่านทาง segue แต่ก็ไม่ได้ช่วยอะไร

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar
{
    [self performSegueWithIdentifier:@"seg1" sender:self];
}

แก้ไข4:

ฉันได้รายงานข้อผิดพลาดนี้ไปยัง Apple แล้วเพราะฉันเดาว่านี่จะต้องเป็นข้อบกพร่องใน UIKit ยังไงก็ตามถ้ามีคนพบวิธีแก้ปัญหาก็คงจะดี


comment
อาจมีบางอย่างปะปนกับการละทิ้ง UISearchController สิ่งหนึ่งที่ควรลองคือย้ายโค้ดผู้รับมอบสิทธิ์ของปุ่มไปยังวิธีที่มีลายเซ็นแบบง่ายๆ จากนั้นเรียกมันด้วย self performSelector   -  person danh    schedule 01.07.2016
comment
ขอบคุณสำหรับแนวคิด ฉันลองแล้ว แต่ปัญหายังคงอยู่   -  person luky    schedule 04.07.2016


คำตอบ (1)


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

เพิ่มปุ่มเป็นมุมมองย่อย และภาพเคลื่อนไหวเดียวจะเกิดขึ้นในการกด การแก้ไขด่วนคือการลบออกก่อนที่จะดำเนินการนำเสนอต่อ ...

- (void)searchBarSearchButtonClicked:(UISearchBar *)searchBar 
{
    [self.navigationItem.titleView removeFromSuperview];

    // and so on with the OP code...

น่าแปลกที่วิธีนี้แก้ไขปัญหาแอนิเมชั่นเพิ่มเติมได้ แต่ไม่ได้ลบแถบค้นหาออกจริงๆ การตรวจสอบ titleView ทันทีหลังจากการลบออก แสดงว่าแถบค้นหายังคงอยู่

person danh    schedule 05.07.2016
comment
เยี่ยมมาก! ดังนั้นฉันไม่รู้ว่าฉันควรจะพึ่งพาวิธีแก้ปัญหาแบบแฮ็กนั้นหรือไม่ เพราะมันดูบั๊กเช่นกัน (ถ้าไม่ลบมุมมอง) - แต่ก็ใช้งานได้ใช่ ปุ่มใดที่ฉันสามารถเพิ่มเป็นมุมมองย่อยได้และที่ไหน - person luky; 18.07.2016
comment
บางทีฉันอาจพึ่งพาวิธีแก้ปัญหาแบบแฮ็กนั้นได้ เช่น ถ้ามันใช้งานได้ในช่วงเวลาคอมไพล์ มันก็จะทำงานตลอดไป ไม่ว่า Apple จะแก้ไขการลบออกในเวอร์ชันอนาคตบางรุ่นหรือไม่ก็ตาม ฉันไม่แน่ใจ. ขึ้นอยู่กับว่า UIKit เชื่อมโยงกับแอปที่คอมไพล์แล้วหรือเรียกว่าแบบไดนามิก - person luky; 18.07.2016
comment
ดีใจที่มันมีประโยชน์ วิธีที่ฉันจัดการคือใช้ UISearchController ตามที่แนะนำในเอกสาร แฮ็คที่แนะนำที่นี่คือเพื่อหลีกเลี่ยงแฮ็คดั้งเดิมของแถบค้นหาเป็นมุมมองชื่อ - person danh; 18.07.2016
comment
โอเคขอบคุณ. ฉันมีข่าวดี! ฉันค้นพบว่าข้อผิดพลาดของแอนิเมชั่นเกิดขึ้นเช่นกันหากคุณโฟกัสไปที่ UINavigationBar แล้วคลิกปุ่ม UI ปกติเพื่อแสดงคอนโทรลเลอร์ใหม่ (ซึ่งใช้ได้ดีหากไม่ได้โฟกัส UINavigationbar!) นั่นหมายความว่าปัญหายังเกี่ยวข้องกับ focus ! นั่นหมายความว่าปัญหาจะได้รับการแก้ไขหากคุณเรียกสิ่งนี้ว่า: [self.navigationItem.titleView resignFirstResponder]; ก่อนที่จะแสดงคอนโทรลเลอร์ใหม่ แต่ความคิดของคุณก็มีประโยชน์เช่นกัน - person luky; 20.07.2016