Lệnh gọi không cân bằng để bắt đầu / kết thúc chuyển đổi giao diện cho <FirstViewController: 0x2a2c00>


93

Tôi gặp sự cố này khi mô phỏng ứng dụng của mình, nó không phải là một lỗi hay một cảnh báo mà nó xuất hiện trong bảng điều khiển của tôi, có ai từng gặp phải vấn đề này trước đây không?


bạn có tạo một số loại hoạt ảnh trong bộ điều khiển chế độ xem đó không?

1
Đúng. Tôi có một hoạt ảnh mở trượt sang các hình ảnh khác nhau, tôi nhận thấy lỗi này chỉ xảy ra khi tôi đang tải mã vào điện thoại.
C.Johns

thông báo lỗi cho thấy bạn bắt đầu quá trình chuyển đổi nhưng thiếu lệnh gọi đến phương thức kết thúc tương ứng.

1
Có điều tương tự. Bất kỳ giải pháp cho điều này?
seeafish

Cũng đang tìm kiếm một giải pháp cho điều này
barfoon

Câu trả lời:


48

Trong trường hợp của tôi, lỗi này xảy ra khi bạn nhấp vào hai tab trong chế độ xem bảng rất nhanh.

Kết quả làm sai tên tiêu đề, nút quay lại biến mất. Ai đó đã đề cập đến điều đó khi bạn đẩy một lượt xem , set animated:NO. Lỗi sẽ biến mất nhưng vẫn gây ra một số hành vi lạ. Nó đẩy hai chế độ xem, sau đó bạn cần quay lại hai lần để quay lại màn hình xem bảng.

Phương pháp tôi đã thử để giải quyết vấn đề này:

thêm vào BOOL cellSelected;

trong viewWillAppear cellSelected = YES;

trong đại biểu didselectcell if (cellSelected){cellSelected = NO; do action ; }

Điều này giúp ngăn việc bấm vào hai ô khác nhau rất nhanh.


5
Tôi đoán là một số từ ngữ khó hiểu. Tôi đã thực hiện một vài chỉnh sửa để tăng khả năng đọc.
Kyle Clegg

42

Trong trường hợp của tôi, nó đã xảy ra khi tôi kích hoạt [self performSegueWithIdentifier:@"SomeIdentifier" sender:self];trong phương thức UINavigationControllercủa một mục viewDidLoad.

Di chuyển nó vào viewDidAppearphương pháp đã giải quyết vấn đề.

Lý do rất có thể là trong viewDidLoadkhông phải tất cả các hoạt ảnh ưa thích đã được hoàn thành, trong khi viewDidAppearmọi thứ đã hoàn thành.


Cảm ơn. Tôi đã bị lạc vào kỷ nguyên thượng cổ, nơi tôi đang tạo mọi mã phần tử UI đơn lẻ. Nội dung bảng phân cảnh là mới đối với tôi.
Kiran Kulkarni,


15

Bạn nên chạy mã của mình trong vòng lặp khác để tránh điều này

 double delayInSeconds = 0.1;
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            // Put your code here
[self presentViewController:self.yourModalVC animated:YES completion:nil];
        });

7
Một ý tưởng tốt hơn là đặt hoạt ảnh trình bày bên trong một dispatch_asynchàng đợi chính. Vấn đề dispatch_asynclà nó đợi cho đến khi tất cả các hoạt ảnh khác trên hàng đợi chính được thực hiện. nó tốt hơn nhiều so với việc sử dụng độ trễ bởi vì: 1- bạn sẽ không bao giờ biết liệu độ trễ có đủ hay không, điều đó phụ thuộc vào thiết bị chủ của bạn 2- bạn sẽ làm quá mức độ trễ và một cái gì đó sẽ bị trễ. hãy thử cái này:dispatch_async(dispatch_get_main_queue(), ^{[self presentViewController:self.yourModalVC animated:YES completion:nil];});
M. Porooshani

12

Tôi đã có rất nhiều vấn đề với cùng một vấn đề. Tôi đã giải quyết vấn đề này bằng cách này

1) Bạn không sử dụng trình UIViewController'skhởi tạo được chỉ định initWithNibName:bundle:. Hãy thử sử dụng nó thay vì chỉ init.

2) đặt thành animated:YESKHÔNG, và điều đó đã giải quyết được vấn đề. ví dụ.[self.navigationController pushViewController: viewController_Obj animated:NO];


7

Tôi đã gặp vấn đề tương tự khi sử dụng bộ điều khiển điều hướng và đẩy các bộ điều khiển khác vào đó. Tôi đã cố gắng sử dụng Bộ điều khiển điều hướng có đệm và một số cách tiếp cận khác, nhưng nó không hiệu quả với tôi. Sau khi dành một chút thời gian để tìm hiểu nó, tôi nhận thấy rằng sự cố này xảy ra nếu bạn cố gắng đẩy bộ điều khiển chế độ xem mới trong khi giao dịch trước đó (hoạt ảnh) đang diễn ra (tôi đoán là khoảng 0,5 giây). Dù sao, tôi đã thực hiện giải pháp nhanh chóng với bộ điều khiển điều hướng ủy quyền và chờ kết thúc hoạt ảnh trước đó.


Cảm ơn bạn! Di chuyển logic của tôi sang viewDidAppear đã giúp ích trong tình huống của tôi.
Jaroslav

7

Đảm bảo rằng bạn không quên trong -viewWillAppear, -viewDidAppear, -viewDidLoad, -viewWillDisappear, -viewDidDisappear để gọi phương thức siêu thích hợp trong quá trình quá tải của bạn các phương thức đó. Ví dụ trong trường hợp của tôi, tên phương thức không khớp như thế này:

-(void)viewDidAppear
{
 [super viewDidDisappear];
 //some code staff
 ..
}

nhận thấy rằng các phương thức xuất hiệnbiến mất không khớp


Chỉ cần dành khoảng hai giờ để gỡ lỗi vấn đề này và đây là những gì nó đã xảy ra. Đang gọi super.viewWillAppear()trong nội bộ viewDidDisappear().
Daniel Wood

Cảm ơn cho mẹo này. Nó không phải là vấn đề duy nhất của tôi, nhưng nó đã giúp!
Anthony C

4

'Các lệnh gọi không cân bằng để bắt đầu / kết thúc quá trình chuyển đổi ngoại hình cho'

Cho biết hoạt ảnh được bắt đầu trước khi hoạt ảnh liên quan cuối cùng không được thực hiện. Vì vậy, bạn có bật bộ điều khiển chế độ xem nào trước khi đẩy bộ điều khiển mới không? Hoặc có thể đang bật tới root? nếu có hãy thử làm như vậy mà không có hoạt ảnh tức là[self.navigationController popToRootViewControllerAnimated:NO];

Và xem liệu điều này có giải quyết được vấn đề hay không, Trong trường hợp của tôi, điều này đã thực hiện được mẹo.


1
Đây là chìa khóa: bật hoặc thay đổi các chuyển đổi bộ điều khiển chế độ xem khác cùng một lúc.
Rocky

2

Tôi gặp sự cố này vì tôi đang gọi UIPrintInteractionController từ viewController mà không có UITabbar và cả UINavigationBar. Có vẻ như UIPrintInteractionController không nhận được printInteractionControllerParentViewController chính xác. Triển khai phương thức trong ủy nhiệm và trả về rootViewController hiện tại đã làm việc cho tôi.

    - (UIViewController*)printInteractionControllerParentViewController:(UIPrintInteractionController*)printInteractionController;

2

Tôi đã gặp sự cố tương tự liên quan đến việc tua lại hộp thoại phương thức. Đã đăng giải pháp ở đây ...

https://stackoverflow.com/a/38795258/324479

[Vấn đề]

Bộ điều khiển điều hướng -> VC1 -Push -> VC2 -PopOver hoặc Modal Segue -> VC3.

VC3 đang giải nén trở lại VC1.

Khi Segue từ VC2 sang VC3 là PopOver và Modal, việc rút ngắn kết thúc trong một cảnh báo: Các lệnh gọi không cân bằng để bắt đầu / kết thúc chuyển đổi giao diện cho UIViewController "

Nếu Segue từ VC sang VC được đẩy, cảnh báo sẽ biến mất.

[Giải pháp]

Sẽ thật tuyệt nếu logic thư giãn sẽ giải quyết vấn đề này. Có thể đó là một lỗi, có thể không. Dù bằng cách nào, giải pháp là đặt VC2 (Bộ điều khiển có cửa sổ bật lên) trở thành mục tiêu của tua lại, sau đó đợi nó xuất hiện xong trước khi bật bộ điều khiển điều hướng lên. Điều đó đảm bảo hoạt ảnh tua lại (cửa sổ bật lên đảo ngược) có đủ thời gian để kết thúc trước khi quay lại tiếp. Ngay cả khi tắt các hoạt ảnh, nó vẫn phải chờ nếu không bạn sẽ gặp lỗi.

Mã của bạn cho VC2 phải như sau. (Nhanh)

class VC2: UIViewController {
    private var unwind = false
    @IBAction func unwindToVC1(segue:UIStoryboardSegue) {
        unwind = true
    }

    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)

        if unwind {
            self.navigationController?.popViewControllerAnimated(false)
        }
    }
}

1

Trường hợp này có thể xảy ra nếu bạn đang thêm chế độ xem với bộ điều khiển chế độ xem phương thức làm chế độ xem phụ. Tốt nhất để sử dụng:

-(void) viewDidAppear:(BOOL)animated {
    [self presentViewController:self.yourModalVC animated:YES completion:nil];
}

Về cơ bản, nó đang nói rằng vòng đời của khung nhìn không được sắp xếp hợp lý cho những viewControllers mà bạn đang cố gắng hiển thị sau đó.


1

Tôi gặp sự cố tương tự khi cố gắng thực hiện:

[self.navigationController popToViewController:[self.navigationController.viewControllers objectAtIndex:2] animated:YES];

trong một hàm như - (void) popUpToLevelTwo;, và đặt một return;ở cuối hàm sẽ giải quyết được vấn đề


1

Tôi cũng nhận được cái này tại

[self dismissModalViewControllerAnimated:YES];

Tôi đã thay đổi YESthành a NOvà điều đó đã giải quyết được vấn đề.


1

tôi gặp vấn đề tương tự khi sử dụng phương thức bật của bộ điều khiển điều hướng Trong ứng dụng của tôi, tôi sử dụng một logic riêng cho bộ điều khiển điều hướng, Vì vậy, tôi đã tránh sử dụng thanh điều hướng và nó luôn bị ẩn. Sau đó, tôi sử dụng một chế độ xem tùy chỉnh và thông báo để xử lý nút bấm và các sự kiện của nó. những người quan sát thông báo được đăng ký và không bị xóa. Vì vậy, thông báo kích hoạt hai lần và nó tạo ra lỗi đã đề cập ở trên. Kiểm tra mã của bạn một cách kỹ lưỡng để nhận được lỗi như vậy


1

Đối với những gì đáng giá, tôi đã gặp lỗi tương tự khi không bao gồm lệnh gọi đến [super viewDidLoad:animated]trong viewDidLoadghi đè của mình .


1
bạn có thể có nghĩa là viewDidAppear? viewDidLoad không có tham số
Fabio Napodano

1

Tôi cũng gặp sự cố này khi nhấn vào một nút từ NIB. Hóa ra tôi đã vô tình kết nối nút để gửi một sự kiện đến hai phương thức IBAction, mỗi phương thức thực hiện một pushViewController: animation:


Cảm ơn !! bạn tiết kiệm thời gian của tôi !!
VD

1

Tôi đã thực hiện một số logic để đợi đẩy UIViewControllercho đến khi tất cả dữ liệu được tải xuống. Đã xảy ra lỗi trong logic này dẫn đến việc đẩy UIViewControllerquá sớm trong khi vẫn còn một lệnh gọi API khác đang diễn ra.

Nó làm cho cùng một UIViewControllerđược đẩy hai lần bởi UINavigationControllervà đưa ra cảnh báo này.


1

Lý do Đối với thông điệp: Thông báo này được hiển thị nếu và chỉ nếu bạn đang đẩy / trình bày khác Xem điều khiển từ viewWillAppear, loadView, inithoặc viewDidLoadphương pháp hiện tại View Controller

Cách xóa lỗi Thông báo: Di chuyển mã đẩy / trình bày của bạn sang viewDidAppearphương thức sẽ giải quyết được vấn đề


1

Swift 4

Vấn đề của tôi là tôi đã trình bày một VC khác trước khi VC hiện tại của tôi hoàn thành để được hiển thị.

Giải pháp là trình bày nextVC của tôi sau một thời gian trì hoãn nhanh chóng.

NHỮNG GÌ BẠN KHÔNG NÊN LÀM

override func viewDidLoad() {
    super.viewDidLoad() 
    self.present(MyNextVC(), animated: true, completion: nil)
}

BẠN NÊN LÀM GÌ

override func viewDidLoad() {
    super.viewDidLoad() 
    //Wait until the view finished to be constructed
    perform(#selector(showMyNextVC), with: nil, afterDelay: 0.01)
}

@objc func showCityList() {
    self.present(MyNextVC(), animated: true, completion: nil)
}

1
Thay vì sử dụng độ trễ, tôi sẽ đặt mã trong viewDidAppear hoặc viewDidLayoutSubviews.
Pranav Kasetti

0

Tôi đã gặp sự cố này khi tôi quên đặt Break; sau khi đẩy chế độ xem trong một tuyên bố chuyển đổi!

Như đây:

case 1:{

        SomeViewController *someViewController = [[SomeViewController alloc]initWithNibName:@"SomeViewController" bundle:Nil];
        [self.navigationController pushViewController:someViewController animated:YES];
        [someViewController release];
    }

        break; //Forgetting to set break here:

0

lý do đằng sau lỗi "Lệnh gọi không cân bằng để bắt đầu / kết thúc chuyển đổi giao diện" là khi bạn điều hướng | segue hai lần cùng một lúc


0

một giải pháp sẽ là,

[NSTimer scheduledTimerWithTimeInterval:0.05(or as required) target:self
selector:@selector(your_selector_method_to_push_the_view) userInfo:nil repeats:NO];

0

Bạn có thể gặp phải vấn đề này nếu bạn cố gắng loại bỏ một UIViewController trước khi tải xong.

Tôi có thông báo này trong bảng điều khiển và đang tập trung hoàn toàn vào UIViewController đang trình bày UIViewController mới, nhưng không thành công. Cuối cùng tôi phát hiện ra sự cố là trong UIViewController mà tôi đang trình bày đang tự loại bỏ vì người dùng chưa đăng nhập vào tài khoản của họ.

Hy vọng điều này sẽ giúp ai đó.


0

Đây là một khó khăn đối với tôi: Tôi đã ghi đè

override func shouldAutomaticallyForwardRotationMethods() -> Bool {
    return true
}

mà không ghi đè:

override func shouldAutomaticallyForwardAppearanceMethods() -> Bool {
    return true
}

trong bộ điều khiển điều hướng gốc cửa sổ của tôi. sau đó một bộ điều khiển điều hướng trẻ em đã phàn nàn khi đẩy một bộ điều khiển xem khác có cảnh báo nêu trên. Cảnh báo không phải là tồi tệ nhất, vấn đề lớn là ở đó người đại diện của bộ điều khiển điều hướng trẻ em không được gọi nữa. mệt mỏi.


0

Trong trường hợp của tôi, tôi đang tìm nạp phương thức NSDatatừ NSURLbên trong ' viewDidLoad'.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.